初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 1115

 
わかったよ、ファイルが壊れているだけで、実行ファイルはそのままだから動くんだ・・・。
 
xxz:

......
EAは動くのですが、エディターで開こうとすると

......

xxz:

実行ファイルではなく、mq5ファイルなのですが...。

これが私のコードです...

だから、フレーズを正しく形成してください。

トピックについて私は通常、このような問題のあるものをメモ帳++で開いています。助かります。しかし、いつもそうとは限りません )))

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

だから、フレーズを正しく形成してください。

トピックについて私は通常、このような問題のあるものをメモ帳++で開いています。助かります。しかし、いつもそうとは限りません )))

また、Notepad++で目を通すことにしたのですが、本来なら通常のファイルサイズなのに、ほとんどゼロになっていました...。

 
このトピックに関連しないコメントは、「MQL4 MT4 MetaTrader 4初心者からの質問」に移動しました。
 

EAを書きました。書いた相手は、1本目で、2つのポジションを次々に開けていくんです。この問題は自分では再現できません。 お願いしたいことがあります。

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デモでテストしているとrequote/offquoteがよく出るので、サーバークラッシュ時の遅延リプレイを入れました。

//+------------------------------------------------------------------+
//| 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);
}
//+------------------------------------------------------------------+

2つ目のポジションは、1つ目のポジションの直後に開き、同じ秒数で、刻みは1つずつ異なります。最初は2つ目のチャートに2つ目のEAがあるのかと思い、全部閉じて1つのチャートを残してEAを動かしてくださいとお願いしましたが、お客様のお話やスクリーンショットから判断すると、そういうわけではなさそうです。後続のポジションは1つずつオープンされ、重複はありません。再現できない、もう頭を抱えた。私のMT5デモのICMarketsのヘッジでも、発注者と同様にテストしています。ダブレットのスクリーンショット。


EA全体。

ファイル:
 
Grigori.S.B:

EAを書きました。書いた相手は、1本目で、2つのポジションを次々に開けていくんです。この問題は自分では再現できません。お願いしたいことがあります。

OnTick()関数

CheckForOpen() 関数のみが、ポジションを開く役割を果たします。

マーケットからポジションを開く要求を送信する関数です。MetaQuotes MT5デモでのテスト中にリクエスト/オフクオートを受けることが多かったので、サーバークラッシュ時の遅延リプレイを入れました。

新しいバーのオープンを制御する機能。

2つ目のポジションは、1つ目のポジションの直後に開き、同じ秒数で、刻みは1つずつ異なります。最初は2つ目のチャートに2つ目のEAがあるのかと思い、全部閉じて1つのチャートを残してEAを動かしてくださいとお願いしましたが、お客様のお話やスクリーンショットから判断すると、そういうわけではなさそうです。後続のポジションは1つずつオープンされ、重複はありません。再現できない、もう頭を抱えた。私の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が何時間も何十ものデュプロットを生成して動作することに困惑しています。また、バーの開閉制御の機能は毎回動作します。そして、その条件に従って、Expert Advisorは何もないときに最初のポジションを開き、最初のポジションが開かれた後、価格が十分に動いたときにのみ次のポジションを開くのです。

 
Grigori.S.B:

EAを書きました。書いた相手は、1本目で、2つのポジションを次々に開けていくんです。この問題は自分では再現できません。お願いしたいことがあります。

OnTick()関数

CheckForOpen() 関数のみが、ポジションを開く役割を果たします。

マーケットからポジションを開く要求を送信する関数です。MetaQuotes MT5デモでのテスト中にリクエスト/オフクオートを受けることが多かったので、サーバークラッシュ時の遅延リプレイを入れました。

新しいバーのオープンを制御する機能。

2つ目のポジションは、1つ目のポジションの直後に開き、同じ秒数で、刻みは1つずつ異なります。最初は2つ目のチャートに2つ目のEAがあるのかと思い、全部閉じて1つのチャートを残してEAを動かしてくださいとお願いしましたが、お客様のお話やスクリーンショットから判断すると、そういうわけではなさそうです。後続のポジションは1つずつオープンされ、重複はありません。再現できない、もう頭を抱えた。私のMT5デモのICMarketsのヘッジでも、発注者と同様にテストしています。ダブレットのスクリーンショット。


EA全体。

また、このバーですでにポジションが開かれて いないことを確認するにはどうすればよいのでしょうか。

 
Artyom Trishkin:

また、このバーでまだどのポジションも開いて いないことをどのように確認するのでしょうか?

いいえ、そのようなチェックはありません。

そんなチェックがあるのです。

  • 新しいバーが開かれた場合、その最初のティックでポジションを建てることができます。
  • ポジションがない場合は、最初のポジションを開くことができます。
つまり、新しいバーの最初のティックで、何らかの理由で2つのポジションが一度にオープンするのです。そして、最初のポジションだけが開かれる。なお、このような現象は観察されていない。
 
Grigori.S.B:

いいえ、そのようなチェックはありません。

そんなチェックがあるのです。

  • 新しいバーが開かれた場合、その最初のティックでポジションを建てることができます。
  • ポジションがない場合は、最初のポジションを開くことができます。
例えば、新しいバーの最初のティックで、何らかの理由で2つのポジションが一度に開く場合。そして、最初のポジションだけが開かれる。さらにこの現象は観察されない。

そこで何が起こっているのか、分析する時間はない。しかし、新しいバーでオープンポジションの 数を確認するようにしてください。そうでない場合 - 開いてください。

理由: