初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1115

 
我想明白了,这只是一个破碎的文件,但可执行文件是完整的,所以它可以工作......
 
xxz:

......
EA工作,但当我试图在编辑器中打开它时

......

xxz:

这不是一个可执行文件,是一个mq5文件...

这是我的代码...

所以要正确地组成你的短语。

关于主题。我通常在Notepad++中打开这种有问题的东西。它有助于。但不一定)))。

 
Сергей Таболин:

所以要正确地组成你的短语。

关于主题。我通常在Notepad++中打开这种有问题的东西。它有助于。但并不总是))))

我还决定用Notepad++查看一下,虽然文件是正常的大小,但几乎都是零。

 
与本主题无关的评论已被移至 "MQL4 MT4 MetaTrader 4初学者的问题"。
 

我已经写了一个EA。我写给的人,在第一次运行时,一个接一个地开了两个位置。我自己也不能重现这个问题。 我想请你帮忙。

OnTick()函数

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
   
   GetData();
   CheckForOpen();
   CheckForCloseCP();
   CheckForCloseAll();

}
//+------------------------------------------------------------------+

只有CheckForOpen()函数负责开仓。

enum opp_mode {
   DoClose,       // Close and reverse with initial lot
   DoReverse,     // Close and reverse (continue Martingale last lot)
   DoHedge,       // No closing reversal (Hedge mode)
};

// Trade & MM Section
input opp_mode Mode_opp    = DoHedge;     // Trading Mode

//+------------------------------------------------------------------+
//| Check for Open function                                          |
//+------------------------------------------------------------------+
void CheckForOpen() {

   if (!IsBarNew) return;

double lot=0;
positions=Positions();

   if (Signal==OP_BUY) {
      if (longs>0) return;
      if (shorts==0) {     // First Order Placing
         Print("   *** MSG ***   "+msg);
         PlaceMarketOrder(OP_BUY, Lot, _ask, _SL, _TP);
      }
      if (shorts>0) {
         if (Mode_opp==DoClose) {      // Closing by Opposite Signal
            Print("   *** MSG ***   "+msg);
            Print("   ***   Close mode SELL by opposite signal."); 
            ClosePositions(OP_SELL);
            PlaceMarketOrder(OP_BUY, Lot, _ask, _SL, _TP);
         }
         if (Mode_opp==DoReverse) {    // Reverse by Opposite Signal
            Print("Reversing SELL by opposite signal.");
            lot=GetMaxLot(ORDER_TYPE_SELL);
            if (IsMartingale) lot=lot*LotMult;
            ClosePositions(OP_SELL);
            PlaceMarketOrder(OP_BUY, lot, _ask, _SL, _TP);
         }
         if (Mode_opp==DoHedge) {      // Hedging by Opposite Signal
            Print("Hedging SELL by opposite signal."); 
            MartinCounterB=50; MartinCounterS=50;
            PlaceMarketOrder(OP_BUY, GetMaxLot(ORDER_TYPE_SELL)*LotMult, _ask, _SL, _TP);
         }
      }
   }
   if (Signal==OP_SELL) {
      if (shorts>0) return;
      if (longs==0) {     // First Order Placing
         Print("   *** MSG ***   "+msg);
         PlaceMarketOrder(OP_SELL, Lot, _bid, _SL, _TP);
      }
      if (longs>0) {
         if (Mode_opp==DoClose) {      // Closing by Opposite Signal
            Print("   *** MSG ***   "+msg);
            Print("   ***   Close mode BUY by opposite signal."); 
            ClosePositions(OP_BUY);
            PlaceMarketOrder(OP_SELL, Lot, _bid, _SL, _TP);
         }
         if (Mode_opp==DoReverse) {    // Reverse by Opposite Signal
            Print("Reversing BUY by opposite signal."); 
            lot=GetMaxLot(ORDER_TYPE_BUY);
            if (IsMartingale) lot=lot*LotMult;
            ClosePositions(OP_BUY);
            PlaceMarketOrder(OP_SELL, lot, _bid, _SL, _TP);
         }
         if (Mode_opp==DoHedge) {      // Hedging by Opposite Signal
            Print("Hedging BUY by opposite signal."); 
            MartinCounterB=50; MartinCounterS=50;
            PlaceMarketOrder(OP_SELL, GetMaxLot(ORDER_TYPE_BUY)*LotMult, _bid, _SL, _TP);
         }
      }
   }
}
//+------------------------------------------------------------------+

从市场发送开仓请求的函数。我在其中加入了服务器崩溃时的延迟回放,因为我在用MetaQuotes MT5演示进行测试时,经常得到重新报价/关闭报价。

//+------------------------------------------------------------------+
//| Place Market Order function                                      |
//+------------------------------------------------------------------+
bool PlaceMarketOrder(int oper, double lot, double oop, double sl, double tp) {   //  mn - Magic Number

double d_sl=0, d_tp=0;

   MqlTick stTick;
   if (SymbolInfoTick(_Symbol,stTick)==false) {
      Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
   }

   Print("Placing market order. Type="+(string)oper+", OrderOpenPrice="+DoubleToString(oop,_Digits)+
         ", Bid="+DoubleToString(_bid,_Digits)+", Ask="+DoubleToString(_ask,_Digits));

   if (MathAbs(lot-Lot)<1 e-5) {MartinCounterB=0; MartinCounterS=0;}
     
   if (oper==OP_BUY)  {
      for (int i=0; i<5; i++) {
         if (SymbolInfoTick(_Symbol,stTick)==false) {
            Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
         }
         _ask=stTick.ask;
         d_sl=ND(_ask-sl*pips); if (MathAbs(sl)<1 e-5) d_sl=ND(0.0);
         d_tp=ND(_ask+tp*pips); if (MathAbs(tp)<1 e-5) d_tp=ND(0.0);
         if (m_trade.Buy(NormalizeLot(lot),NULL,_ask,d_sl,d_tp,Comm)) {PlaySound("expert.wav"); return(true);}
         else {PlaySound("disconnect.wav"); Sleep(5000);}
      }
   }
   if (oper==OP_SELL) {
      for (int i=0; i<5; i++) {
         if (SymbolInfoTick(_Symbol,stTick)==false) {
            Print("SymbolInfoTick function returned FALSE. Error=", GetLastError());
         }
         _bid=stTick.bid;
         d_sl=ND(_bid+sl*pips); if (MathAbs(sl)<1 e-5) d_sl=ND(0.0);
         d_tp=ND(_bid-tp*pips); if (MathAbs(tp)<1 e-5) d_tp=ND(0.0);
         if (m_trade.Sell(NormalizeLot(lot),NULL,_bid,d_sl,d_tp,Comm)) {PlaySound("expert.wav"); return(true);}
         else {PlaySound("disconnect.wav"); Sleep(5000);}
      }
   }
     
   return(false);
     
}
//+------------------------------------------------------------------+

控制一个新酒吧的开放的功能。

//+------------------------------------------------------------------+
//| Global Variables                                                 |
//+------------------------------------------------------------------+
bool   IsBarNew=false;


//+------------------------------------------------------------------+
//| Bar refreshing function                                          |
//| true - new bar opened, false - not opened                        |
//+------------------------------------------------------------------+
bool IsNewBar() {

static datetime SavedTime=iTime(NULL,PERIOD_CURRENT,0);
       datetime curTime  =iTime(NULL,PERIOD_CURRENT,0);

   if (curTime>SavedTime) {
         SavedTime=curTime;
         return(true);
   }
   else return(false);
}
//+------------------------------------------------------------------+

第二个仓位在第一个仓位之后立即打开,在同一秒内,刻度线相差一个。我最初以为在第二个图表上有第二个EA副本。 我要求关闭所有的图表,只留下一个图表并运行该EA,但根据客户的说法以及从截图来看,这不是原因。后续的仓位是一个一个地开的,没有重复的了。我无法复制它,我已经绞尽脑汁了。我已经在我的MT5演示ICMarkets对冲以及订购者上进行了测试。复式的截图。


整个EA。

附加的文件:
 
Grigori.S.B:

我已经写了一个EA。我写给的人,在第一次运行时,一个接一个地开了两个位置。我自己也不能重现这个问题。我想请你帮忙。

OnTick()函数

只有CheckForOpen()函数负责开仓。

从市场发送开仓请求的函数。我在其中加入了服务器崩溃时的延迟回放,因为我在MetaQuotes MT5演示的测试中经常收到请求/关闭报价。

控制一个新酒吧的开放的功能。

第二个仓位在第一个仓位之后立即打开,在同一秒内,刻度线相差一个。我最初以为在第二个图表上有第二个EA副本。 我要求关闭所有的图表,只留下一个图表并运行该EA,但根据客户的说法以及从截图来看,这不是原因。后续的仓位是一个一个地开的,没有重复的了。我无法复制它,我已经绞尽脑汁了。我已经在我的MT5演示ICMarkets对冲以及订购者上进行了测试。复式的截图。


整个EA。

我使用这个功能来控制新的酒吧--有时在复制酒吧日期时出现错误。

//+------------------------------------------------------------------------------------------------------------------+
//| Возвращает TRUE, если появился новый бар на текущем ТФ
//+------------------------------------------------------------------------------------------------------------------+
bool isNewBar()
  {
   datetime tm[];
   static datetime prevBarTime=0;

   if(CopyTime(_Symbol,0,0,1,tm)<0)
     {
      Print("%s CopyTime error = %d",__FUNCTION__,GetLastError());
     }
   else
     {
      if(prevBarTime!=tm[0])
        {
         prevBarTime=tm[0];
         return true;
        }
      return false;
     }
   return true;
  }
 
Aleksey Vyazmikin:

我使用这样的功能来控制一个新的条形图--有的时候,在复制条形图日期的时候会出现错误。

谢谢你。我将尝试替换它。虽然到目前为止,我所使用的功能也是很好的。我有一个想法,在打印中显示条形图的开盘时间和价格;然后就可以清楚地看到错误的存在。

然而,我感到困惑的是,只有在打开第一个头寸时才会出现重复的头寸,而随后的头寸却能正确打开,并且EA工作了几个小时,产生了几十个重复的头寸。而且,酒吧开放控制的功能每次都能发挥作用。根据这些条件,专家顾问在没有头寸的情况下打开第一个头寸,只有在第一个头寸打开后价格移动足够大时,才会打开下一个头寸。

 
Grigori.S.B:

我已经写了一个EA。我写给的人,在第一次运行时,接连开了两个位置。我自己也不能重现这个问题。我想请你帮忙。

OnTick()函数

只有CheckForOpen()函数负责开仓。

从市场发送开仓请求的函数。我在其中加入了服务器崩溃时的延迟回放,因为我在用MetaQuotes MT5演示进行测试时,经常得到重新报价/关闭报价。

控制一个新酒吧的开放的功能。

第二个仓位在第一个仓位之后立即打开,在同一秒内,刻度线相差一个。我最初以为在第二个图表上有第二个EA副本。 我要求关闭所有的图表,只留下一个图表并运行该EA,但根据客户的说法以及从截图来看,这不是原因。后续的仓位是一个一个地开的,没有重复的了。我无法复制它,我已经绞尽脑汁了。我已经在我的MT5演示ICMarkets对冲以及订购者上进行了测试。复式的截图。


整个EA。

那你如何检查在这一栏中是否已经开过仓

 
Artyom Trishkin:

那你如何检查这个栏位上还没有开仓

不,没有这样的检查。

有这样的检查。

  • 如果一个新的条形图已经打开,它的第一个刻度可以被打开。
  • 如果没有位置,可以打开第一个位置。
换句话说,由于某种原因,在一个新条形图的第一个刻度上,有两个头寸同时打开。而且只开放了第一个职位。进一步说,这样的现象没有被观察到。
 
Grigori.S.B:

不,没有这样的检查。

有这样的检查。

  • 如果一个新的条形图已经打开,它的第一个刻度可以被打开。
  • 如果没有位置,可以打开第一个位置。
也就是说,由于某种原因,在一个新条形图的第一个刻度上,有两个头寸同时打开。而且只开放了第一个职位。进一步说,这种现象没有被观察到。

我没有时间去分析那里发生了什么。但要尝试在新的条形图上检查未结头寸 的数量。如果没有--------打开。