diagonal order form
This commit is contained in:
@@ -1,23 +1,15 @@
|
||||
<template>
|
||||
<order title="Diagonal" subtitle="Trade trends and channels" :tranches="buildTranches" :valid="validOrder">
|
||||
<order title="Diagonal" subtitle="Trends and channels" :tranches="buildTranches" :valid="validOrder">
|
||||
<!-- todo times -->
|
||||
<span><i>Coming soon!</i></span>
|
||||
<!--
|
||||
<limit-price :required="true" label="start price" :show-price="false"/>
|
||||
<limit-price store-var="limitPrice2" :required="true" label="end price"/>
|
||||
<v-table>
|
||||
<thead>
|
||||
<tr><td>Fraction</td><td>Amount</td><td>Price</td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr v-for="(r,i) in rungsFmt">
|
||||
<td>{{(100*fractions[i]).toFixed(1)}}%</td>
|
||||
<td>{{(amounts[i]).toPrecision(5)}} {{os.amountToken.symbol}}</td>
|
||||
<td>{{r}}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</v-table>
|
||||
-->
|
||||
<div class="title">Line Point A</div>
|
||||
<v-divider/>
|
||||
<time-entry v-model="time1" class="mb-0" hide-details="true"/>
|
||||
<limit-price v-model="price1" label="Price A" :required="true"/>
|
||||
<div class="title">Line Point B</div>
|
||||
<v-divider/>
|
||||
<time-entry v-model="time2" hide-details="true"/>
|
||||
<limit-price v-model="price2" label="Price B" :required="true"/>
|
||||
<div><i>Backend support for diagonal lines is coming soon...</i></div>
|
||||
</order>
|
||||
</template>
|
||||
|
||||
@@ -26,65 +18,22 @@ import {useOrderStore} from "@/store/store";
|
||||
import LimitPrice from "@/components/LimitPrice.vue";
|
||||
import Order from "@/components/Order.vue";
|
||||
import {computed, ref} from "vue";
|
||||
import {applyLimit} from "@/orderbuild.js";
|
||||
import {applyLimit, applyLinePoints} from "@/orderbuild.js";
|
||||
import {validateRequired, validateTranches} from "@/validate.js";
|
||||
import {MAX_FRACTION, newTranche} from "@/blockchain/orderlib.js";
|
||||
import TimeEntry from "@/components/TimeEntry.vue";
|
||||
|
||||
const os = useOrderStore()
|
||||
|
||||
const skew = ref(0)
|
||||
const rungs = computed(()=>{
|
||||
if( !os.limitPrice || !os.limitPrice2 )
|
||||
return []
|
||||
const n = os.tranches;
|
||||
const a = parseFloat(os.limitPrice);
|
||||
const b = parseFloat(os.limitPrice2);
|
||||
if( n < 1 || !a || !b ) return []
|
||||
if( n === 1 ) return [(a+b)/2]
|
||||
// num >= 2
|
||||
const result = []
|
||||
const delta = (b-a)/(n-1)
|
||||
for( let i=0; i<n; i++ )
|
||||
result.push(a+i*delta)
|
||||
return result
|
||||
})
|
||||
const rungsFmt = computed(()=>{
|
||||
return rungs.value.map((r)=>r.toPrecision(5)) // todo precisions
|
||||
})
|
||||
const fractions = computed(()=>{
|
||||
const n = os.tranches
|
||||
const s = skew.value / 100
|
||||
const result = []
|
||||
if( s === 1 ) {
|
||||
result.push(1)
|
||||
for( let i=1; i<n; i++ )
|
||||
result.push(0)
|
||||
}
|
||||
else if( s === -1 ) {
|
||||
for( let i=1; i<n; i++ )
|
||||
result.push(0)
|
||||
result.push(1)
|
||||
}
|
||||
else {
|
||||
const mean = 1/n
|
||||
for( let i=0; i<n; i++ )
|
||||
result.push( mean * ( 1 - s * (2*i/(n-1)-1) ) )
|
||||
}
|
||||
return result
|
||||
})
|
||||
const amounts = computed( ()=>fractions.value.map((f)=>f*os.totalAmount) )
|
||||
const time1 = ref(new Date())
|
||||
const price1 = ref(null)
|
||||
const time2 = ref(new Date())
|
||||
const price2 = ref(null)
|
||||
|
||||
function buildTranches() {
|
||||
const ts = []
|
||||
const n = os.tranches
|
||||
for( let i=0; i<n; i++ ) {
|
||||
// todo optional deadline
|
||||
const fraction = Math.min(MAX_FRACTION, Math.ceil(MAX_FRACTION * fractions.value[i]) )
|
||||
const tranche = newTranche({fraction})
|
||||
applyLimit(tranche, rungs.value[i])
|
||||
ts.push(tranche)
|
||||
}
|
||||
return ts
|
||||
const t = newTranche();
|
||||
applyLinePoints(t, time1.value, price1.value, time2.value, price2.value)
|
||||
return [t]
|
||||
}
|
||||
|
||||
function validOrder() {
|
||||
|
||||
Reference in New Issue
Block a user