EAが複数のペアで実行されない、助けが必要

 
私はmql4のコーディングに非常に慣れており、最初のEAを完成させました。私の唯一の問題は、複数のペアで取引を開始させることができないことです。ジャーナルの横のターミナルのEAセクションで、EAが1つのペアでうまく取引を開いたり閉じたりしているにもかかわらず、orderclose関数の ための無効なチケットというエラーのストリームを送信しています。どなたかご教授ください。
 
Matt_Townsend:
私はmql4のコーディングに非常に慣れており、最初のEAを完成させました。私の唯一の問題は、複数のペアで取引を開始させることができないことです。ジャーナルの横のターミナルのEAセクションで、EAが1つのペアでうまくトレードを開いたり閉じたりしているにもかかわらず、orderclose関数のための無効なチケットというエラーのストリームを送信しています。どなたかご教授ください。

もし、あなたのコードやエラーのログを見せないのなら、どうやって私たちに知らせろというのですか?

私たちは心を読むことはできません! 私たちの助けが必要な場合は、あなたのコードとそれが与えるエラー(ログの結果)を表示する必要があります。また、どの通貨ペアで、どの時間枠でテストしているかも教えていただければ、あなたのコードを見る際に役立ちます。

また、MetaTrader4では Strategy Testerで 一度にテストできる通貨は1 つだけであることに注意してください。もしあなたのEAが1つのチャートから同時に複数の通貨を取引する場合、ストラテジーテスターで テストすることはできません。

 
Matt_Townsend: EAが1つのペアでうまく取引を開始、終了しているにもかかわらず。
というわけで、私がお勧めするのは
1つのEAで複数の通貨を取引しないでください
  • この場合、定義済みの 変数は使用できず、テスターも使用 できず、ポーリングしなければならず(OnTickではありません)、通常その他の問題が発生します。
  • チャートペアのみを取引するようにコーディングしてください。必要なら他のペアを見ます。(Time[i] == iTime(otherPair,tf,i) always useiBarShift. と仮定しないでください。)
  • そして、他のペアを取引するために他のチャートにそれを置く。完了です。
 
Matt_Townsend: ここに私のコードは、私はライブデモで問題を持っている、私も私は問題を解決するために、複数の端末を使用できるかどうかを確認しようとしたことがあります。これまでのところ、あなたのフィードバックに感謝します。

投稿を編集し、SRCボタンを使ってコードを追加してください。 読みにくいので、標準テキストとしてコピー/ペーストしないでください。他のスレッドを見れば、どのようにすればいいのかわかると思います。SRCボタンを使ってコードを投稿してください。

EDIT: 以前リクエストしたとおり - . ..また、どの通貨ペアと 時間枠でテストしているのかを教えていただけると助かります ...

EDIT2:前に要求 されたように - ... と同様に、それが与えるエラー(ログの結果)...

 
Fernando Carreiro:
投稿を編集し、SRCボタンを使ってコードを追加してください。 読みにくいので、標準テキストとしてコピー/ペーストしないでください。他のスレッドを見れば、どのようにすべきかは分かると思います。SRCボタンを使ってコードを投稿してください。
//+------------------------------------------------------------------+
//|                     Simple Moving Average Crossover Strategy.mq4 |
//|                                                 Matthew Townsend |
//+------------------------------------------------------------------+
#property version   "1.05"
#property strict
//---

//---Inputs
extern  double Lots         =0.01;
extern  int    FastMA       =5;
input   int    FastMAMode   =MODE_EMA;
extern  int    SlowMA       =8;
input   int    SlowMAMode   =MODE_SMA;

//+----------------------------------------+
//|undesirables                            |
//+----------------------------------------+
int init()
{
   //----
   //----
   return(0);
}

int deinit()
{
   //----
   //----
   return(0);
}
//+---------------------------------------------+
//|System start                                 |
//+---------------------------------------------+
int start()
{


    double fastma, slowma;
    int    ticket, total;
    //---define Ma's
    
    fastma = iMA(NULL,0,5,0,MODE_EMA,PRICE_CLOSE,0);
    slowma = iMA(NULL,0,8,0,MODE_SMA,PRICE_CLOSE,0);
    
    total = OrdersTotal();
    //---Start operations
    
    if(total < 1)
    {
       if(fastma > slowma)
       {
         ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,10,0,0,"",0,0,Blue);
         if(ticket > 0)
         {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Print("Buy order opened : ", OrderOpenPrice());
         }
         else
           Print("Error opening order : ", GetLastError());
           return(0);
       }
       if(fastma < slowma)
       {
         ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,10,0,0,"",0,0,Red);
         if(ticket > 0)
         {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
            Print("Sell order opened : ", OrderOpenPrice());
         }
         else
           Print("Error opening order : ", GetLastError());
           return(0);
       }
       return(0);
    }
    bool ans;
    
        
         if(OrderType()==OP_BUY)
         {
           while(fastma < slowma)
           {
             ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
             if(ticket < 1)
             {      
                if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                Print("Buy order closed : ", OrderClosePrice());    
             }    
             else
               Print("Error closing order : ", GetLastError());
               return(0);
           }
         }
      if(OrderType()==OP_SELL)
        {
          while(fastma > slowma)
          {
             ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
             if(ticket < 1)
             {
               if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
               Print("Sell order closed : ", OrderClosePrice());
              
             }
             else
               Print("Error closing order : ", GetLastError());
               return(0);
          }
          
        }
    
    return(0);
}

//+-----------------------------------------------------------------------------------+
 
Fernando Carreiro:
スレッドが長くならないように、新しい投稿を追加するのではなく、前の投稿をEDITして いただくようお願いしました
私もこの掲示板の初心者で申し訳ないのですが、2つの投稿を削除してもいいでしょうか?
 
Matt_Townsend:
1時間足、EURUSD、1時間足GBPUSDでテストしていました
以下のコードに対して、すでに2つのコンパイラ警告が出ています。
...
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
...
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
...

クローズ操作の結果を正しく確認できていません。

ロジックの面ではいくつか問題がありますが、現状では私のストラテジーテスターでは エラーなく動いていますので、出ているエラーのリストを提供してください

 
Fernando Carreiro:
以下のコードに対して、すでに2つのコンパイラ警告が出ています。
...
ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
...
ans = OrderClose(OrderTicket(),Lots,Ask,10,clrNONE);
...

クローズ操作の結果を正しくチェックできていません。

ロジックの面ではいくつか問題がありますが、現状では私の方では何のエラーもなく動いていますので、出ているエラーのリストを提示してください

EAのエラーは、orderclose関数の invalid ticketとその横にある数字だけです。もし、ログがエラーで埋まり始めたら、どのように実際のログを見せればいいのでしょうか?
 
Matt_Townsend:
EAのエラーは、orderclosefunctionの invalid ticketとその横に数字が書いてあるだけです。実際のログをお見せしたいのですが、EAが動いている2番目のチャートでは、通常はすぐに取引を開始しようとするのですが、何もして いません。もし、ログがエラーで埋まり始めたら、どのように実際のログを見せればいいのでしょうか?

問題の行をクリック、Ctrl-クリック、Shift-クリック(ウィンドウズの標準操作)で選択し、選択範囲を右クリックして「コピー」を選択します

EDIT: コードに関して、あなたはOrderSelectを 使用していますが、常にそれが毎回動作すると仮定しています。そして、それが動作しない場合、OrderTicket() のような注文詳細関数をクローズで使用し続け、最初のOrderSelect() も失敗した場合、失敗する可能性があるのです。このように、あなたのコードには多くの論理的な問題があります。

 

    bool ans;

   

         //You do not select an order

         if(OrderType()==OP_BUY)
         {
           while(fastma < slowma)                                 //Use if not while
           {
             ans = OrderClose(OrderTicket(),Lots,Bid,10,clrNONE);
             if(ticket < 1)                                        //ticket is a local variable and has not been assigned a value
             {     
                if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                Print("Buy order closed : ", OrderClosePrice());   
             }   
             else
               Print("Error closing order : ", GetLastError());
               return(0);
           }
         }
クローズオーダーの部分を論理的に書き直し、ここで変数ticketを使うべきでは全くありません。
 
Matt_Townsend:
EAのエラーは、orderclose関数の チケットが無効で、その横に数字が書かれているだけです。もし、ログがエラーでいっぱいになったら、どのように実際のログを見せればいいのでしょうか?

複数の通貨ペアや時間枠でEAを使用する場合、もう一つ非常に重要なことがあります。

あなたのコードは「マジックナンバー」選択を使用せず、履歴の未決済注文をチェックする際に使用されているシンボル(「マジックナンバー」も)をチェックしません。従って、本質的にあなたのEAは、それ自体も他のEAも正しく動作しません。

このままでは、他のEAが動いていない状態で、このEA単体でしか使えませんし、他のチャートでこのEA単体でも使えません

理由: