您好。
在讨论时请使用源码。
另外提醒您, 讨论代码时请使用代码表述功能。
【新手必看】如何防止机器人误判:讨论代码时请使用代码表述功能
- 2023.06.13
- Sky All
- www.mql5.com
您好。
在讨论时请使用源码。
另外提醒您, 讨论代码时请使用代码表述功能。
【新手必看】如何防止机器人误判:讨论代码时请使用代码表述功能
https://www.mql5.com/zh/forum/448896
你好版主,编程遇到问题了,求助
我编写了一个ea,加载到图表运行没有问题,但是在历史回测的时候总是不断的弹出附图指标窗口。指标是自定义指标,若换成系统自带指标则不会重复弹出附图窗口。仅仅自定义的时候会,这是为什么呢?
下边是源码
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link "https://www.mql5.com"
#property version "1.00"
//+------------------------------------------------------------------+
input double gammacs= 0.9;
input ENUM_TIMEFRAMES 周期=PERIOD_M30;
input int 跟踪止损点数=500;
input double 手数=0.01;
input int 组号=69425;
//+------------------------------------------------------------------+
int kkk=0;
int ddd=0;
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
void OnTick()
{
int bars=Bars(_Symbol,周期);
int dds=ccdds(_Symbol,组号);
int kds=cckds(_Symbol,组号);
double laguesz[];
laguezb(laguesz,4,_Symbol,周期,gammacs,150);
if(dds==0 && ddd!=bars)
if(laguesz[0]>0.5 && laguesz[1]<0.5)
{
kaidan(_Symbol,0,手数,0,跟踪止损点数,组号);
ddd=bars;
}
if(kds==0 && kkk!=bars)
if(laguesz[0]<0.5 && laguesz[1]>0.5)
{
kaidan(_Symbol,1,手数,0,跟踪止损点数,组号);
kkk=bars;
}
if(dds+kds>0)
{
gzzs(_Symbol,组号,跟踪止损点数);
}
}
//+------------------------------------------------------------------+
int laguezb(double &lagus[],int 数量,string symbol,ENUM_TIMEFRAMES 图表周期,double gammacs1,int CountBarscs1)
{
int h=iCustom(symbol,图表周期,"lague",gammacs1,CountBarscs1);
ArraySetAsSeries(lagus,true);
int a;
a=CopyBuffer(h,0,0,数量,lagus);
//IndicatorRelease(h);
return(a);
}
void kaidan(string 货币兑1,bool 开单方向,double 手数1,double 止盈,double 止损,int 组号1)//开单函数内设开单方向0--多1--空
{
MqlTradeRequest a= {};
MqlTradeResult b= {};
ZeroMemory(a);
ZeroMemory(b);
a.action=TRADE_ACTION_DEAL;
a.magic=组号1;
a.symbol=货币兑1;
a.volume=手数1;
if(止盈!=0)
{
a.tp=止盈;
}
if(止损!=0)
{
a.sl=止损;
}
a.deviation=100;
a.type_filling=ORDER_FILLING_FOK;
if(开单方向==0)
{
a.type=ORDER_TYPE_BUY;
a.price=SymbolInfoDouble(货币兑1,SYMBOL_ASK);
}
if(开单方向==1)
{
a.type=ORDER_TYPE_SELL;
a.price=SymbolInfoDouble(货币兑1,SYMBOL_BID);
}
if(!OrderSend(a,b))
PrintFormat("OrderSend error %d",GetLastError()); // 如果不能发送请求,输出错误
}
//+------------------------------------------------------------------+
void gzzs(string symbol1,int 组号1,int 跟踪止损点数1) //跟踪止损点数(以点数止损)
{
double ask=SymbolInfoDouble(symbol1,SYMBOL_ASK);
double bid=SymbolInfoDouble(symbol1,SYMBOL_BID);
int t=PositionsTotal();
for(int i=t-1; i>=0; i--)
{
ulong ccbh=PositionGetTicket(i);
if(PositionGetInteger(POSITION_MAGIC)==组号1&& PositionGetString(POSITION_SYMBOL)==symbol1)
{
double price=0;
double sl=PositionGetDouble(POSITION_SL);
long typ=PositionGetInteger(POSITION_TYPE);
double kop=PositionGetDouble(POSITION_PRICE_OPEN);
double zzc=跟踪止损点数1*Point();
if(sl!=0)
{
if(typ==POSITION_TYPE_SELL && (bid+zzc)<sl && kop>bid)
{
price=bid+zzc;
};
if(typ==POSITION_TYPE_BUY && (ask-zzc)>sl && kop<ask)
{
price=ask-zzc;
}
}
else
{
if(typ==POSITION_TYPE_BUY)
{
price=kop-zzc;
};
if(typ==POSITION_TYPE_SELL)
{
price=kop+zzc;
}
};
if(price!=0)
{
MqlTradeRequest a= {};
MqlTradeResult b= {};
ZeroMemory(a);
ZeroMemory(b);
a.action=TRADE_ACTION_SLTP; // 交易操作类型
a.symbol=PositionGetString(POSITION_SYMBOL); // 交易品种
a.position =ccbh;
a.symbol=symbol1;
a.sl=price;
a.magic=组号1;
if(!OrderSend(a,b))
PrintFormat("OrderSend error %d",GetLastError()); // 如果不能发送请求,输出错误
}
}
}
};
//+------------------------------------------------------------------+
int ccdds(string symbol1,int 组号1)//总持仓多单数量
{
int zongdanshu=0;
int t=PositionsTotal();
for(int i=t-1; i>=0; i--)
{
ulong ccbh=PositionGetTicket(i);
if(PositionGetInteger(POSITION_MAGIC)==组号1 && PositionGetString(POSITION_SYMBOL)==symbol1 && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
{
zongdanshu++;
}
}
return(zongdanshu);
}
int cckds(string symbol1,int 组号1)//总持仓空单数量
{
int zongdanshu=0;
int t=PositionsTotal();
for(int i=t-1; i>=0; i--)
{
ulong ccbh=PositionGetTicket(i);
if(PositionGetInteger(POSITION_MAGIC)==组号1 && PositionGetString(POSITION_SYMBOL)==symbol1 && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
{
zongdanshu++;
}
}
return(zongdanshu);
}
double getclose(string 品种,ENUM_TIMEFRAMES 周期1,int 第几根) //获得 close
{
return(iClose(品种,周期1,第几根));
}
- 2024.04.23
- www.mql5.com
把自訂義指標宣告修改放在init宣告一次就可以了
你的宣告放在自訂義函數裡面 一直重複宣告調用 所以會重複加載
自编了一个EA,运行起来没有问题,EA中有调用自定义指标。
但是策略测试时 却不断加载自定义指标。