input int StartHour = 23; // Время ачало торговли input int TakeProfit = 40; // TakeProfit input int StopLoss = 40; // StopLoss input int Lots = 0.1; // Лот для торговли input int Magic = 22; // Магическое число input int Trals = 20; // Дистанция тралинга в пунктах input int _Step = 1; // Шаг input bool _StepUse = true; // Использовать шаг или нет
input int StartHour = 23; // Время ачало торговли input int TakeProfit = 40; // TakeProfit input int StopLoss = 40; // StopLoss input int Lots = 0.1; // Лот для торговли input int Magic = 22; // Магическое число input int Trals = 20; // Дистанция тралинга в пунктах input int _Step = 1; // Шаг input bool _StepUse = true; // Использовать шаг или нет
input int StartHour = 1; // Начало торговли input int TakeProfit = 40; // TakeProfit input int StopLoss = 10; // StopLoss extern double Lots = 0.1; // Лот для торговли input int Magic = 22; // Магическое число input int Trals = 5; // Дистанция тралинга в пунктах input int _Step = 1; // Шаг input bool _StepUse = false; // Использовать шаг или неT
void OnTick() { static bool IsFirstTick = false;
Trailing();
if (StartHour != Hour()) { return;} if (OrdersTotal()>0) { OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot",Magic); OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot",Magic); } }
//+------------------------------------------------------------------+ void Trailing() { if (_StepUse) { for (int trall=0; trall<OrdersTotal(); trall++) { if (!(OrderSelect(trall, SELECT_BY_POS, MODE_TRADES))) continue; if (OrderSymbol() != Symbol()) continue;
if (StartHour != TimeHour(Time[0])) { return;}//Если час текущей свечи не равен StartHour то выход из функции и тогда ниже написанный код выполнятся не будет, в том числе и трейлинг стоп.
if (OrdersTotal()>0)
{
....
}
替换为。
if (OrdersTotal()==0)
{
bool rezult = false;
rezult=OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
if (!rezult) Print("Ошибка открытия ордера BUY LIMIT");
rezult = OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
if (!rezult) Print("Ошибка открытия ордера SELL LIMIT");
//для работы в реале надо сделать более детальную проверку ошибок
} else Trailing();
void Trailing()
{
if (_StepUse)//если false то код внутри скобок выполнятся не будет.
{
......
}
}// Скорее всего вы этот код просто бездумно скопировали от куда нибудь, даже не понимая как он работает.
需要帮助。
http://forum.mql4.com/ru/67309#1011467
请告知:订单不是每天都打开的,拖网不起作用,打开的订单不是根据TP来关闭的。我做错了什么?
input int StartHour = 23; // Время ачало торговли
input int TakeProfit = 40; // TakeProfit
input int StopLoss = 40; // StopLoss
input int Lots = 0.1; // Лот для торговли
input int Magic = 22; // Магическое число
input int Trals = 20; // Дистанция тралинга в пунктах
input int _Step = 1; // Шаг
input bool _StepUse = true; // Использовать шаг или нет
void OnTick()
{
static bool IsFirstTick = false;
static int ticket = 0;
double lot=Lot_Normalize(Symbol(),Lots,1);
double sl= Dist_Normalize(Symbol(),Trals);
double step= Dist_Normalize(Symbol(),_Step);
int h= TimeHour(TimeCurrent());
if(h == StartHour)
{
Alert("TimeHor: ", h);
if (IsFirstTick == true)
IsFirstTick = false;
bool res;
res= OrderSelect(ticket, SELECT_BY_TICKET);
if(res == true)
{
if(OrderCloseTime() == 0)
{
bool res2;
res2 = OrderClose(ticket, Lots, OrderClosePrice(), 10);
if(res2 == false)
{
Alert("Error Closing Order #", ticket);
} Alert("Closing Order #", ticket);
}
}
if(Open[0] < Open[StartHour])
{
ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot");
Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
if(ticket < 0)
{
Alert("Error Sending Order!");
} Alert("Sending Order! BUY_LIMIT");
}
else
{
ticket = OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot");
Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
if(ticket < 0)
{
Alert("Error Sending Order!");
} Alert("Sending Order! SEL_LLIMIT");
}
}
}
double Dist_Normalize(string Smv, int _Distancia)
{
int Dig= int(MarketInfo(Smv,MODE_DIGITS));
double Pip=MarketInfo(Smv,MODE_POINT);
if(Dig==3 || Dig==5)
return NormalizeDouble(_Distancia*10*Pip,Dig);
else return NormalizeDouble(_Distancia*Pip,Dig);
}
double Lot_Normalize(string Smv, double _lot, double _mult)
{
double minlot=MarketInfo(Smv,MODE_MINLOT);
double maxlot=MarketInfo(Smv,MODE_MAXLOT);
double steplot=MarketInfo(Smv,MODE_LOTSTEP);
double lot= _lot*_mult;
if(lot<=minlot) lot+minlot;
else if(lot>=maxlot) lot=minlot;
else if(lot>minlot && lot<maxlot)
{
int k=int((lot-minlot)/steplot);
lot=NormalizeDouble(minlot+k*steplot,2);
}
return(lot);
}
void Tralling_Stop(string Smv, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
int Dig=int(MarketInfo(_Symbol,MODE_DIGITS));
for(int pos=OrdersTotal()-1; pos>=0;pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Smv &&
OrderMagicNumber()==_Magic && OrderType()<2)
{
double SLPrice;
if(OrderType()==OP_BUY)
{
if(_Step_Use)
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
{
SLPrice=NormalizeDouble(Ask-_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Error modifi Order!: ",GetLastError());
}
}
else
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
{
SLPrice=NormalizeDouble(Bid+_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Error modifi Order!: ",GetLastError());
}
}
}
}
}
}
请告知:订单不是每天都打开的,拖网不起作用,打开的订单不是根据TP来关闭的。我做错了什么?
input int StartHour = 23; // Время ачало торговли
input int TakeProfit = 40; // TakeProfit
input int StopLoss = 40; // StopLoss
input int Lots = 0.1; // Лот для торговли
input int Magic = 22; // Магическое число
input int Trals = 20; // Дистанция тралинга в пунктах
input int _Step = 1; // Шаг
input bool _StepUse = true; // Использовать шаг или нет
void OnTick()
{
......
IsFirstTick = false。
我想用以下方式取代这块
其中TM变量在OnTick()函数 之外被声明为DateTime,也就是说,它对这个模块是全局的。
我不明白这段代码: if(Open[0] < Open[StartHour])
StartHour等于23,它表明零条的开盘价将与它之前的第23条的开盘价进行比较。嗯,好吧,也许这是专家顾问的一个小把戏。
但这种设计根本就不合适。
如果门票变量等于零,或者EA已经被重新初始化,这个变量已经被默认重置,怎么办?
StartHour是EA应该工作的时间。应该是凌晨1点。为什么拖网不起作用?
你需要分析代码以了解它为什么不工作。
尝试在Tralling_Stop() 函数中插入Print("Tralling_Stop")函数,看看日志中是否出现这个消息(Tralling_Stop),如果没有,那么这个函数没有被调用。如果你有,分析一下Tralling_Stop()函数本身,也许它包含一些逻辑错误。
一般来说,在有逻辑条件的地方,插入Print("条件1")、Print("条件2"),等等。在策略测试器中运行专家顾问,在日志中你可以追踪你的EA的逻辑。
你需要分析代码以了解它为什么不工作。
尝试在Tralling_Stop() 函数中插入Print("Tralling_Stop")函数,看看日志中是否出现这个消息(Tralling_Stop),如果没有,那么这个函数没有被调用。如果是,请分析一下Tralling_Stop()函数本身--也许其中有一些逻辑错误。
一般来说,在有逻辑条件的地方,插入Print("条件1")、Print("条件2"),等等。在策略测试器中运行专家顾问,在日志中你可以追踪你的EA的逻辑。
我试着重写了一下,但还是不能按我的要求工作。当我想要的时候,订单没有被打开,那么它们就没有被颤动。根据这个想法,专家顾问应该这样工作:在一天的最后一根蜡烛收盘时(00:00),它应该打开两个挂单:高位(买入)和低位(卖出),然后就把它们甩掉。
input int StartHour = 1; // Начало торговли
input int TakeProfit = 40; // TakeProfit
input int StopLoss = 10; // StopLoss
extern double Lots = 0.1; // Лот для торговли
input int Magic = 22; // Магическое число
input int Trals = 5; // Дистанция тралинга в пунктах
input int _Step = 1; // Шаг
input bool _StepUse = false; // Использовать шаг или неT
void OnTick()
{
static bool IsFirstTick = false;
Trailing();
if (StartHour != Hour()) { return;}
if (OrdersTotal()>0)
{
OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
}
}
//+------------------------------------------------------------------+
void Trailing()
{
if (_StepUse)
{
for (int trall=0; trall<OrdersTotal(); trall++) {
if (!(OrderSelect(trall, SELECT_BY_POS, MODE_TRADES))) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderType() == OP_BUY ) {
if (Bid-OrderOpenPrice() > StopLoss*Point || OrderMagicNumber()==Magic) {
if (OrderStopLoss() < Bid-(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
OrderModify(OrderTicket(), OrderOpenPrice(), Bid-StopLoss*Point, OrderTakeProfit(), 0, Blue);
}
}
}
if (OrderType() == OP_SELL) {
if (OrderOpenPrice()-Ask > StopLoss*Point || OrderMagicNumber()==Magic) {
if (OrderStopLoss() > Ask+(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
OrderModify(OrderTicket(), OrderOpenPrice(), Ask+StopLoss*Point, OrderTakeProfit(), 0, Blue);
}
}
}
}
}
}
//+------------------------------------------------------------------+
尝试
替换为。
替换为。
此外,价格必须使用NormalizeDouble() 进行规范化处理。也就是说,你必须写NormalizeDouble(Low[1]-StopLoss* Point,Digits())而不是Low[1]-StopLoss*Point。
另外,根据你的代码,如果_StepUse变量等于false,你的追踪止损就不会发挥作用。仔细看一下Trailing()函数的代码
尝试
替换为。
替换为。
此外,价格必须使用NormalizeDouble() 进行规范化处理。也就是说,你必须写NormalizeDouble(Low[1]-StopLoss*Point,Digits())而不是Low[1]-StopLoss*Point。
另外,根据你的代码,如果_StepUse变量等于false,你的追踪止损就不会发挥作用。仔细看一下Trailing()函数的代码。
你们有联系吗?给我发个信息,http://vk.com/computerwizard116。我不知道如何解决EA的问题了。在我的模拟账户上,我已经在这个策略上工作了一个星期
而且很有效。而在测试中,这个流氓甚至没有把订单关闭到取出点(((((( 在照片中,你可以看到价格超过了取出点,然后回去了,但它以亏损收盘,该死的!((()
他为什么要这样做?
你们有联系吗?给我发电子邮件,http://vk.com/computerwizard116。我不知道如何解决EA的问题了。我已经在模拟账户上使用这个策略一周了
而它的作用。但在测试时,这个流氓甚至不把订单关闭到外卖。(((((( 在照片中,你可以看到价格超过了外卖,又回去了,但它以亏损收盘。
它为什么要这样做呢?
我没有接触过。
获利和止损订单的执行 不取决于顾问,它们是在经纪人的服务器上执行。该EA只设置止盈和止损,不执行它们。检查在价格达到该值后是否已经设置了止盈。换句话说,订单先被打开,然后价格来回波动,然后设置止盈。
我没有接触过。
获利和止损订单的执行 并不取决于EA,它们是在经纪人的服务器上执行。该EA只设置采取和停止指令,不执行它们。检查在价格达到该值后是否已经设置了止盈。换句话说,订单先被打开,然后价格来回波动,然后设置止盈。