[TOC] ¿Qué quieres decir?
FMZ es una plataforma de negociación cuantificada, principalmente para servir a los operadores programáticos. Pero también ofrece un terminal de negociación básico, aunque con funciones simples, que a veces puede ser muy útil, por ejemplo, cuando el mercado está ocupado y no puede abrirse, y la API puede funcionar, en este momento se puede retirar, hacer pedidos, ver cuentas de transacción, etc. Para perfeccionar la experiencia del terminal de negociación, ahora se agregan funciones de complemento.
El plugin tiene dos modos de ejecución, de ejecución inmediata y de ejecución en segundo plano. El funcionamiento en segundo plano es equivalente a crear un robot (pago normal). El principio de la ejecución inmediata y la herramienta de depuración son los mismos: se ejecutan por el administrador que envía un código a la página de la terminal de transacciones y se admite el retorno de gráficos y tablas (la herramienta de depuración también está siendo actualizada), que se ejecutan en solo 5 minutos, sin cargo ni límite de idioma.
Cuando se escribe una política, se necesita seleccionar el tipo de política como un complemento.El resultado de la función principal de retorno del complemento aparece en el terminal después de su ejecución, y es compatible con las cuerdas, diagramas y tablas. Como la ejecución del complemento no se ve en el registro, puede devolver el resultado de la ejecución del complemento.
Si buscas directamente en el cuadro de búsqueda, verás que hay una gran cantidad de sitios web en línea.Tenga en cuenta que solo se puede ejecutar la política de tipo de complemento de transacción.En la página web del sitio web, el usuario puede encontrar el plugin en el sitio web del sitio web, y luego hacer clic en agregar.https://www.fmz.com/square/21/1
Si no hay parámetros, la política de clic se ejecuta directamente en la interfaz de configuración de parámetros, el administrador, la pareja de transacciones y el ciclo de línea K seleccionados por el terminal de transacciones son los parámetros correspondientes por defecto. La política de ejecución de clic se inicia y se ejecuta de inmediato en el modo de ejecución de parámetros seleccionado.
Al hacer clic en la ubicación de la muestra, se detiene el plugin, ya que todos los plugins se ejecutan en un proceso de herramienta de depuración.
Los complementos pueden ejecutar código durante un tiempo, pueden ejecutar algunas operaciones simples, muchas veces las operaciones manuales que requieren una ejecución repetida se pueden realizar con el complement, fácil de negociar. A continuación se presentarán ejemplos concretos, el código fuente dado puede ser utilizado como referencia para personalizar su propia estrategia.
El hedge de futuros a través de períodos es una estrategia muy común, ya que la frecuencia no es muy alta, y muchas personas operan manualmente, lo que requiere un contrato más, un contrato vacío, y analizar el movimiento del diferencial.
El primer paso es introducir un complemento de diferenciación de tiempo:
var chart = {
__isStock: true,
title : { text : '差价分析图'},
xAxis: { type: 'datetime'},
yAxis : {
title: {text: '差价'},
opposite: false,
},
series : [
{name : "diff", data : []},
]
}
function main() {
exchange.SetContractType('quarter')
var recordsA = exchange.GetRecords(PERIOD_M5) //周期可以自行定制
exchange.SetContractType('this_week')
var recordsB = exchange.GetRecords(PERIOD_M5)
for(var i=0;i<Math.min(recordsA.length,recordsB.length);i++){
var diff = recordsA[recordsA.length-Math.min(recordsA.length,recordsB.length)+i].Close - recordsB[recordsB.length-Math.min(recordsA.length,recordsB.length)+i].Close
chart.series[0].data.push([recordsA[recordsA.length-Math.min(recordsA.length,recordsB.length)+i].Time, diff])
}
return chart
}
Para ver los precios de los últimos períodos, haga clic en el siguiente enlace:https://www.fmz.com/strategy/187755
Con el análisis de diferencias, se descubre que las diferencias se están acercando, es una oportunidad de hacer contratos de cuartos vacíos, hacer varios días de semana, que se puede usar con un complemento de cobertura de un botón, haga clic, y le ayudará automáticamente a pasar varios días de semana vacíos, más rápido que la operación manual. El principio de implementación de la estrategia es el deslizamiento del precio para abrir la misma cantidad de posiciones, puede ejecutarse varias veces, alcanzar lentamente la cantidad de posiciones que necesita, evitar el impacto del mercado, puede cambiar los parámetros predeterminados para alcanzar una velocidad más rápida.https://www.fmz.com/strategy/191348
function main(){
exchange.SetContractType(Reverse ? Contract_B : Contract_A)
var ticker_A = exchange.GetTicker()
if(!ticker_A){return 'Unable to get quotes'}
exchange.SetDirection('buy')
var id_A = exchange.Buy(ticker_A.Sell+Slip, Amount)
exchange.SetContractType(Reverse ? Contract_B : Contract_A)
var ticker_B = exchange.GetTicker()
if(!ticker_B){return 'Unable to get quotes'}
exchange.SetDirection('sell')
var id_B = exchange.Sell(ticker_B.Buy-Slip, Amount)
if(id_A){
exchange.SetContractType(Reverse ? Contract_B : Contract_A)
exchange.CancelOrder(id_A)
}
if(id_B){
exchange.SetContractType(Reverse ? Contract_B : Contract_A)
exchange.CancelOrder(id_B)
}
return 'Position: ' + JSON.stringify(exchange.GetPosition())
}
Esperar a que la diferencia se acerque, se necesita el equilibrio, se puede ejecutar un complemento de equilibrio de un solo botón, el equilibrio de velocidad más rápida.
function main(){
while(ture){
var pos = exchange.GetPosition()
var ticker = exchange.GetTicekr()
if(!ticker){return '无法获取ticker'}
if(!pos || pos.length == 0 ){return '已无持仓'}
for(var i=0;i<pos.length;i++){
if(pos[i].Type == PD_LONG){
exchange.SetContractType(pos[i].ContractType)
exchange.SetDirection('closebuy')
exchange.Sell(ticker.Buy, pos[i].Amount - pos[i].FrozenAmount)
}
if(pos[i].Type == PD_SHORT){
exchange.SetContractType(pos[i].ContractType)
exchange.SetDirection('closesell')
exchange.Buy(ticker.Sell, pos[i].Amount - pos[i].FrozenAmount)
}
}
var orders = exchange.Getorders()
Sleep(500)
for(var j=0;j<orders.length;j++){
if(orders[i].Status == ORDER_STATE_PENDING){
exchange.CancelOrder(orders[i].Id)
}
}
}
}
El más común es el encargo de la montaña de hielo, que desmonta el gran libro en pequeños libros, aunque se puede ejecutar como un robot, pero un complemento de 5 minutos es en realidad suficiente. Hay dos tipos de encargo de la montaña de hielo, uno es comer un solo libro, uno es el libro de suspensión, si hay una oferta de tarifas, se puede elegir el libro de suspensión, es decir, el tiempo de ejecución es más largo.
El siguiente código es el de Iceberg para comprar el código fuente del complemento:https://www.fmz.com/strategy/191771El código fuente es vendido:https://www.fmz.com/strategy/191772
function main(){
var initAccount = _C(exchange.GetAccount)
while(true){
var account = _C(exchange.GetAccount)
var dealAmount = account.Stocks - initAccount.Stocks
var ticker = _C(exchange.GetTicker)
if(BUYAMOUNT - dealAmount >= BUYSIZE){
var id = exchange.Buy(ticker.Sell, BUYSIZE)
Sleep(INTERVAL*1000)
if(id){
exchange.CancelOrder(id) // May cause error log when the order is completed, which is all right.
}else{
throw 'buy error'
}
}else{
account = _C(exchange.GetAccount)
var avgCost = (initAccount.Balance - account.Balance)/(account.Stocks - initAccount.Stocks)
return 'Iceberg order to buy is done, avg cost is '+avgCost
}
}
}
La ocupación de comprar o vender es también una forma de envío lento, con un impacto menor en el mercado. Esta estrategia también tiene algunas mejoras, ya que se puede cambiar manualmente el volumen mínimo de operaciones o la precisión. Las compras:https://www.fmz.com/strategy/191582Se vende en:https://www.fmz.com/strategy/191730
function GetPrecision(){
var precision = {price:0, amount:0}
var depth = exchange.GetDepth()
for(var i=0;i<exchange.GetDepth().Asks.length;i++){
var amountPrecision = exchange.GetDepth().Asks[i].Amount.toString().indexOf('.') > -1 ? exchange.GetDepth().Asks[i].Amount.toString().split('.')[1].length : 0
precision.amount = Math.max(precision.amount,amountPrecision)
var pricePrecision = exchange.GetDepth().Asks[i].Price.toString().indexOf('.') > -1 ? exchange.GetDepth().Asks[i].Price.toString().split('.')[1].length : 0
precision.price = Math.max(precision.price,pricePrecision)
}
return precision
}
function main(){
var initAccount = exchange.GetAccount()
if(!initAccount){return '无法获取账户信息'}
var precision = GetPrecision()
var buyPrice = 0
var lastId = 0
var done = false
while(true){
var account = _C(exchange.GetAccount)
var dealAmount = account.Stocks - initAccount.Stocks
var ticker = _C(exchange.GetTicker)
if(BuyAmount - dealAmount > 1/Math.pow(10,precision.amount) && ticker.Buy > buyPrice){
if(lastId){exchange.CancelOrder(lastId)}
var id = exchange.Buy(ticker.Buy, _N(BuyAmount - dealAmount,precision.amount))
if(id){
lastId = id
}else{
done = true
}
}
if(BuyAmount - dealAmount <= 1/Math.pow(10,precision.amount)){done = true}
if(done){
var avgCost = (initAccount.Balance - account.Balance)/dealAmount
return 'order is done, avg cost is ' + avgCost // including fee cost
}
Sleep(Intervel*1000)
}
}
Algunas veces, para vender un mejor precio de envío o para colgar un pedido en espera de una fuga, se pueden colgar varios pedidos a intervalos determinados. Este complemento también se puede utilizar para colgar futuros.https://www.fmz.com/strategy/190017
function main() {
var ticker = exchange.GetTicker()
if(!ticker){
return 'Unable to get price'
}
for(var i=0;i<N;i++){
if(Type == 0){
if(exchange.GetName().startsWith('Futures')){
exchange.SetDirection('buy')
}
exchange.Buy(Start_Price-i*Spread,Amount+i*Amount_Step)
}else if(Type == 1){
if(exchange.GetName().startsWith('Futures')){
exchange.SetDirection('sell')
}
exchange.Sell(Start_Price+i*Spread,Amount+i*Amount_Step)
}else if(Type == 2){
exchange.SetDirection('closesell')
exchange.Buy(Start_Price-i*Spread,Amount+i*Amount_Step)
}
else if(Type == 3){
exchange.SetDirection('closebuy')
exchange.Sell(Start_Price+i*Spread,Amount+i*Amount_Step)
}
Sleep(500)
}
return 'order complete'
}
El software de comercio de futuros comúnmente utilizado suele tener muchas funciones avanzadas de suscripción, como suscripción de pérdidas y pérdidas, suscripción de condiciones, etc., que pueden ser escritas fácilmente como plugins.https://www.fmz.com/strategy/187736
var buy = false
var trade_amount = 0
function main(){
while(true){
if(exchange.IO("status")){
exchange.SetContractType(Contract)
if(!buy){
buy = true
if(Direction == 0){
exchange.SetDirection('buy')
exchange.Buy(Open_Price, Amount)
}else{
exchange.SetDirection('sell')
exchange.Sell(Open_Price, Amount)
}
}
var pos = exchange.GetPosition()
if(pos && pos.length > 0){
for(var i=0;i<pos.length;i++){
if(pos[i].ContractType == Contract && pos[i].Type == Direction && pos[i].Amount-pos[i].FrozenAmount>0){
var cover_amount = math.min(Amount-trade_amount, pos[i].Amount-pos[i].FrozenAmount)
if(cover_amount >= 1){
trade_amount += cover_amount
if(Direction == 0){
exchange.SetDirection('closebuy_today')
exchange.Sell(Close_Price, cover_amount)
}else{
exchange.SetDirection('closesell_today')
exchange.Buy(Close_Price, cover_amount)
}
}
}
}
}
} else {
LogStatus(_D(), "未连接CTP !")
Sleep(10000)
}
if(trade_amount >= Amount){
Log('任务完成')
return
}
Sleep(1000)
}
}
Después de ver tantas pequeñas funciones, deberías tener tus propias ideas, tal vez escribir un complemento para facilitar tus transacciones manuales.
el mismo¿Qué es lo que causa la falta de información? Error: Futures_OP 0: 400: {"error_message":"Open orders exist","code":35017, "error_code":"35017","message":"Open orders exist"} Buy ((5000, 0.1): 400: {"error_message":"order_size error","result":"true","error_code":"35063","order_id":"-1"}
Las hierbasConsulte la documentación de la bolsa o consulte el servicio de atención al cliente de la bolsa.