[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 118

 
Shixan:

下午。

我写了代码,在a=true和b=true的条件下打开两个挂单(BuyStop和SellStop),一段时间后,EA关闭这两个订单,直到出现新的信号,但有时EA会在同一方向上打开两个挂单。为什么会发生这种情况,如何避免这种 "错误"?



如果(a=true &&b=true)
{
int OrderCount = OrdersTotal()。
如果(OrderCount>1)返回(0)。
ticket1=OrderSend(Symbol(), OP_BUYSTOP, getLot(), PriceOpen_Buy, slippage, PriceOpen_Sell,0,0,Green) 。
睡眠(1000)。

ticket2=OrderSend(Symbol(), OP_SELLSTOP, getLot(), PriceOpen_Sell, slippage, PriceOpen_Buy,0,0,Green) 。

Sleep(1000*59*TimeFrame);

for (int i=OrdersTotal()-1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
如果(OrderType()==OP_BUYSTOP ) OrderDelete(OrderTicket())。
如果(OrderType()==OP_SELLSTOP ) OrderDelete(OrderTicket())。
如果(OrderType()==OP_SELL ) OrderClose(OrderTicket(),OrderLots(),Ask, slippage);
如果(OrderType()==OP_BUY ) OrderClose(OrderTicket(),OrderLots(),Bid,slipage)。
}

return(0);

}


你能给我一个提示吗?

预先谢谢你

我没有看你的代码,但是......为了不在一个信号上下两个或更多的订单,在下订单之前先检查一下:这个信号上是否已经有订单?如果没有--把它放上去,如果有--抽烟。
 
mario065:

你好。

是否可以在设置中输入一个固定权重为1:1的时间表?

如果有可能的话,请告诉我如何做。

提前感谢。

这个图书馆 可以。

"3.3 设置图表属性的函数 "章节中的ServiceSetScaleFix1To1()。

该图书馆只适用于俄罗斯和英语的本地化。它也可能在你那里起作用。

 
嗨,你能告诉我为什么在MetaEditor的新版本451中,当你编译时,第二个ex 4文件没有出现在mq 4文件旁边的专家文件夹中。
 

这里是订单开放功能。

//+-------------------------------------------------------------------------------------+
//| Открытие короткой позиции                                                           |
//+-------------------------------------------------------------------------------------+
bool OpenSell(double price)
{
   int ticket = -1;
   double SL = OrderOpenPrice() + i_sl * pt;
   double TP = OrderOpenPrice() - i_tp * pt;
   
   if (price < Bid)
       ticket = OrderSend(Symbol(), OP_SELLSTOP, 0.1, ND(price), 3, 0, 0, NULL, i_magic, 0);
       
   if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
   {
      if (i_sl > 0 && OrderStopLoss() == 0)
      {
         if (!OrderModify(ticket, OrderOpenPrice(), ND(SL), ND(TP), 0, Red))
         {
            Print ("Ошибка установки первичного стопа для шортов ", OrderType(), " - ", GetLastError());
            Print("pt = ", pt);
            Print("Ask = ", Ask);
            Print("Bid = ", Bid);
            Print("SL_s = ", OrderOpenPrice() + i_sl * pt);
            Print("TP_s = ", OrderOpenPrice() - i_tp * pt);
         }
      }
   }
       return (true);
}

下面是参数打印结果。

2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: TP_s = 1.4499
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: SL_s = 1.4519
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: Bid = 1.4513
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: Ask = 1.4515
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: pt = 0.0001
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: Ошибка установки первичного стопа для шортов 5 - 4051
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: OrderModify error 4051
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: invalid takeprofit for OrderModify function
2013.01.26 11:02:56     2010.01.12 00:00  Phillip_Nel's_TS_for_M5 EURUSD,M5: open #1 sell stop 0.10 EURUSD at 1.45091 ok

在这里你可以清楚地看到,TP和SL价格分别低于和高于Ask和Bid,也就是说,一切都很正确。但由于某些原因,我得到了一个修改错误,因为停止是错误的。怎么说呢?

 
hoz:

这里是订单开放功能。

下面是参数打印结果。

在这里你可以清楚地看到,TP和SL价格分别低于和高于Ask和Bid,也就是说,一切都很正确。但由于某些原因,我得到了一个修改错误,因为停止是错误的。怎么说呢?

你甚至读过被骂的内容吗?

错误的函数值 4051 无效的函数参数值

如果你有什么不明白的地方,我们会和其他人一起解决......。

当你下一个挂单 时,字符串

if (price < Bid)

当你下一个挂单时,这个字符串应该不大相关。应该检查它与MarketInfo(Symbol(), MODE_STOPLEVEL)中设置的最小允许距离是否对应。第一件事是立即引起我的注意。

第二是打印订单的价格。止损和止盈不应该相对于卖出价和买入价设置,而应该相对于订单设置价格设置。

 
Zhunko:

这个图书馆 可以。

"3.3 图形属性设置函数 "章节中的ServiceSetScaleFix1To1()函数。

该图书馆只适用于俄罗斯和英语的本地化。它也可能在你那里起作用。

谢谢Zhunko。
 
artmedia70:

你甚至读过被骂的内容吗?

错误的函数值 4051 函数参数的无效值

看看传递给被调用函数的参数。 当什么都不清楚的时候,我们就安安静静地把它整理出来...


我当然在读,所以我很好奇。 我解除了所有输入参数的链接。

这就是我得到的东西。

bool OpenSell(double price)
{
   int ticket = -1;
   double SL = OrderOpenPrice() + i_sl * pt;
   double TP = OrderOpenPrice() - i_tp * pt;
   
   if (price < Bid)
       ticket = OrderSend(Symbol(), OP_SELLSTOP, 0.1, ND(price), 3, 0, 0, NULL, i_magic, 0);
       
   if (ticket > 0 && OrderSelect(ticket, SELECT_BY_TICKET == true))
   {
      if (i_sl > 0 && OrderStopLoss() == 0)
      {
         Print("ND(price) = ", DoubleToStr(ND(price),Digits));
         Print("ND(SL) = ", DoubleToStr(ND(SL),Digits));
         Print("ND(TP) = ", DoubleToStr(ND(TP),Digits));
         Print("ND(OOP) = ", DoubleToStr(ND(OrderOpenPrice()),Digits));
         if (!OrderModify(ticket, ND(OrderOpenPrice()), ND(SL), ND(TP), 0, Red))
         {
            Print ("Ошибка установки первичного стопа для шортов ", OrderType(), " - ", GetLastError());
            Print("pt = ", pt);
            Print("Ask = ", Ask);
            Print("Bid = ", Bid);
            Print("SL_s = ", OrderOpenPrice() + i_sl * pt);
            Print("TP_s = ", OrderOpenPrice() - i_tp * pt);
         }
      }
   }
       return (true);
}

以下是日志中的内容。

2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: TP_s = 1.4485
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: SL_s = 1.4505
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: Bid = 1.4496
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: Ask = 1.4497
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: pt = 0.0001
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: Ошибка установки первичного стопа для шортов 5 - 4051
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: OrderModify error 4051
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: invalid takeprofit for OrderModify function
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: ND(OOP) = 1.44946
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: ND(TP) = -0.00100
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: ND(SL) = 0.00100
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: ND(price) = 1.44946
2013.01.26 12:16:22	2010.01.12 01:45  Phillip_Nel's_TS_for_M5 EURUSD,M5: open #4 sell stop 0.10 EURUSD at 1.44946 ok

有些命令被修改,有些则没有。开始时ND(TP)ND(SL) 的值被恢复为随机值。为什么?

顺便说一下,正常化功能是我的。

//+-------------------------------------------------------------------------------------+
//| Функция нормализации                                                                |
//+-------------------------------------------------------------------------------------+
double ND(double A)
{
  return (NormalizeDouble(A, Digits));
}
 
artmedia70:

你甚至读过被骂的内容吗?

错误的函数值 4051 函数参数的无效值

请看传递给要调用的函数的参数。当什么都不清楚的时候,我们会和世界一起解决这个问题......

ZS.当你下达一个挂单时,该行

if (price < Bid)

这并不十分恰当。你应该检查最小允许距离是否与MarketInfo(Symbol(), MODE_STOPLEVEL)中指定的距离相一致。第一件事马上吸引了我的注意。



我通常在修改订单时遇到这样的检查,但在打开订单时没有遇到。我已经看到了,如果我把待价而沽设置为bystop,那将是一个错误。而如果我设置10个点的止损,它肯定会高于StopLoss值。我不在蜱虫上交易 :)
 
artmedia70:


第二,打印订单的价格。止损和止盈不应相对于卖出价和买入价,而应相对于设置订单的价格。



我想这是为了修改?毕竟,当我们开单时,对我们来说重要的是买入和卖出。我已经用上面的帖子理顺了一切。
 

下午好。

我想让一个EA同时在几个窗口工作。但每个工具只能开一个订单。因此,现在有一个条件。

int total = OrdersTotal();

如果(总数<1){分析和开仓块},否则{分析和平仓块}。

现在,如果它同时在两个符号上打开,在一个符号上打开就会在另一个符号上受阻。这就是为什么我编造了类似的东西。

int total = OrdersTotal();

int cnt;

if(total>0)
{
for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol()
{
Symbol_FLAG = true;
}
}
}

如果(total<1 || total>0 && Symbol_FLAG == false) { 分析并打开ptposition块}。

但它在测试器上不起作用...

也许你能告诉我,也许我在做一些无法实现的事情?