[存档!]任何菜鸟问题,为了不给论坛添乱。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 2. - 页 29

 

你好...

我写了一个EA,但遇到了这个问题。

我有相反的订单,例如,对于买入,我有150个点的止损和150个点的利润,对于卖出,设置了同样的水平,但只是相反(即买入的利润,然后是卖出的止损),也就是说,实际上我必须同时关闭一切,既卖出与买入,又买入与卖出.....,但还有另一件事,就是点差!))而从这两个相反的订单中,其他8个已经打开了(当然,如果需要所有8个,对它们的条件是不同的,它们也是相反的4/4)。


我怎样才能正确地编写代码,在所有订单同时达到相同的价格时关闭它们?因为在测试器中,当我测试时,价格有时会达到一个理想的水平,例如,卖出平仓(没有达到预定的水平,我相信这是一个差价)和买入挂牌,短时间后下跌,买入平仓在停止,所以我不能看到正确的结果。


如果你能以编程的方式表达你的想法,即代码,我将不胜感激。


为了更详细地了解它,我把我的两个相反的(第一)订单打开的部分给你。

if (by == FALSE) 
   {   g_ticket_112 = OrderSend(Symbol(), OP_BUY, Lots, NormalizeDouble(Ask, Digits), 1, NormalizeDouble(Ask - SL * Point, Digits), 
       NormalizeDouble(Ask + TP * Point, Digits), "", 111, 0, Blue);
   if (g_ticket_112 > 0) by = TRUE;
   } 
     
     if (se == false) 
   {for (g_pos_116 = OrdersTotal() - 1; g_pos_116 >= 0; g_pos_116--) 
   {if (OrderSelect(g_pos_116, SELECT_BY_POS, MODE_TRADES)) 
   {if (OrderSymbol() != Symbol() || OrderMagicNumber() != 111) continue;
    if (se == false) 
   {g_ticket_113 = OrderSend(Symbol(), OP_SELL, Lots, NormalizeDouble(Bid, Digits), 1, 
    OrderTakeProfit(),OrderStopLoss() , "", 222, 0, Blue);
    if (g_ticket_113 > 0) se = TRUE;}}}} 
 
你们是否有一个脚本,可以将日程表延伸到所有的周末,也就是说,日程表不与周一合并,周六和周日仍然是空的。
 

大家好。

问题是,你是否有一个函数可以检测到一个新条形 的开口(无论什么时间框架),或者更准确地说,找到一个新条形的不同变种。

 
dmitriy086:

大家好。

问题是,你是否有一个功能可以检测到一个新条形的开口(无论什么时间框架),或者更准确地说,不同的变体(拖车)可以找到一个新条形。


记忆时间 oldtime = Time[0]并比较记忆的时间 if( oldtime !=Time[0])Print("Hurray for a new bar!!!" )。

SZY: 拖车是在iTime()函数中。

:)

 
//+------------------------------------------------------------------+
bool fNewBar()
  {
   static datetime NewTime=0;
   if(NewTime!=iTime (Symbol(),0,0))
    {
     if(NewTime==0)
      {
       NewTime=iTime (Symbol(),0,1);return(false);
      }      
     NewTime=iTime (Symbol(),0,0);
     return(true);
    }
   return(false);     
  }
//+----------------------------------------------------------------------------+

IgorM,问题是这个f-fi是在一个合成图上,iTime[0]可以等于iTime[1],那么我们怎样才能摆脱时间,使专家顾问在一个新的柱子 上只开一个交易?
 
dmitriy086:
IgorM,问题是这个f-fi是在一个合成图上,iTime[0]可能等于iTime[1],所以我们如何摆脱时间,使EA在一个新条形上只开一个交易?


如果第0条和第1条的时间由于某种未知的原因而无法匹配--数据类型以 为单位存储数据,那么至少要将第1条的时间改为1秒。

然后试着记住 第一个闭合 柱的所有特征,即OHLC、成交量和开盘时间--如果你改变了哪怕一个 参数,就意味着一个新的柱。

iBars()将显示当前时间框架内的条数,并将受到终端设置 的限制,你可以尝试将条数与存储的条数和新条数出现的时刻进行比较,这些数值是不同的--但并不总是如此,对我来说这种方式是有效的,但可能由于MT4的构建数量,这个选项可能不工作

 
你有现成的代码吗? 我不知道如何记住OHLC[1]并与OHLC[0]进行比较......。
 
dmitriy086:
你没有现成的代码吧? 我想不出如何记住OHLC[1]并与OHLC[0]进行比较......


OHLC是Open,High,Low,Close的常用缩写。

不与零进行比较,而是与之前记忆的第一项进行比较,即

init(){

oldHigh = High[1];

///

}

start(){

double tmp = High[1];

如果(tmp !=oldHigh) {oldHigh = tmp;

//检查其余的酒吧参数

}

}

 

谢谢你的建议,我将研究一下...

 

请告知如何在开仓 条件下设置正确的检查--该仪器是否有开仓的情况。如果有一个符号的头寸(任何卖出或买入),那么开仓就不会发生,否则就会触发开仓的信号?

下面是代码(我认为它负责开仓)。

if (NumberOfPositions("" ,-1,Magic)>=2)  флаг1=1;//если число позиций >= 2
if (NumberOfPositions("" ,-1,Magic)<1 )  флаг1=0;//если нет откр. позиций
if ( TradeDOWN==true && флаг1==0) {//если условия соответствуют заданным  
//продаем 1-й символ и покупаем второй символ
//----------------------------------------
if (NumberOfPositions(Symbol_1,OP_SELL,Magic)<1){//если нет поз.селл и поз.бай по 1-му символу
 if (NumberOfPositions(Symbol_1,OP_BUY,Magic)<1)
 {
 SL=0;TP=0;//открываем позицию, задаем стопы :
if(StopLoss_1>0)   SL=Bid_Tiker1+POINT_Tiker1*StopLoss_1;
if(TakeProfit_1>0) TP=Bid_Tiker1-POINT_Tiker1*TakeProfit_1; 
 ti=OpenPosition(Symbol_1, OP_SELL, Lots_1,0 ,0,Magic);
if(StopLoss_1>0 || TakeProfit_1>0) {//ставим стопы 
if (OrderSelect(ti, SELECT_BY_TICKET)) ModifyOrder(-1, SL, TP, clModifySell);}
                                   }}//если нет поз.селл и поз.бай по 1-му символу
//--------------------------------------
if (NumberOfPositions(Symbol_2,OP_BUY,Magic)<1){//если нет поз. бай и поз. селл по 2-му символу 
 if (NumberOfPositions(Symbol_2,OP_SELL,Magic)<1)
 {
   SL=0;TP=0;//открываем позицию, задаем стопы :
if(StopLoss_2>0)   SL=Bid_Tiker2-POINT_Tiker2*StopLoss_2;
if(TakeProfit_2>0) TP=Ask_Tiker2+POINT_Tiker2*TakeProfit_2;   
ti=OpenPosition(Symbol_2, OP_BUY, Lots_2,0,0,Magic);
if(StopLoss_2>0 || TakeProfit_2>0) {//ставим стопы 
if (OrderSelect(ti, SELECT_BY_TICKET))ModifyOrder(-1, SL, TP, clModifyBuy); }
                                   }}//если нет поз. бай и поз. селл по 2-му символу

从逻辑上看,这似乎是正确的,但它仍然为一个符号打开了几个位置。

P.S. 我不是程序员。如果有可能的话,请向傻瓜解释更多细节。