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

 
Fernando Carreiro:

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

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

このままでは、他のEAが動作していない状態で、このEAを単独で使用することしかできず、他のチャート上でこのEAを使用することもできません。

私のコードに協力していただき、ありがとうございました。
 
Keith Watford:

    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);
           }
         }
コードのclose orderセクションを論理的に書き直し、ここで変数ticketを使用する必要は全くありません。
以前これを書いているときは、ticketという変数を持っていませんでしたが、それを置くことでコードの動作に影響があるかどうかを見ていたのです。
 
Matt_Townsend:
これまでの私のコードとあなたの時間を助けていただき、どうもありがとうございました。

EAのロジックに問題があるようですので、MetaQuotesの サンプルコード「Moving Average.mq4」「MACD Sample.mq4」を見て、EAの基本原理を理解するまで、それを基に構築することをお勧めします。

ファイルを添付しましたが、"MQL4Experts "フォルダーにあります。

ファイル:
 
Fernando Carreiro:

EDIT: コードに関して、あなたはOrderSelectを 使用していますが、それが毎回うまくいくことを常に想定しているのです。そして、うまくいかないときは、OrderTicket() のような注文の詳細関数をクローズで使い続けるだけで、最初のOrderSelect() も失敗すれば、失敗する可能性があるのです。

あなたの編集に気づいた後......。

私はずっと、新しいティックがあるとOrderSelect()は失われるものと思っていました。

そこで調べて みると、一度選択された注文は、その後の新しいティックでも選択されたままであることがわかりました。

毎日、新しいことを学んでいます :)

 
Keith Watford: あなたの編集に気づいた後......。

私はこれまで、新しいティックがあるとOrderSelect()は失われると考えていました。

そこで調べてみると、一度選択された注文は、その後の新しいティックでも選択されたままであることがわかりました。

毎日、新しいことを学んでいます :)

しかし、実際には、これらの詳細は時間的に凍結されるため、OrderClosePrice() などは再度選択し直すまで更新されないので、ほとんど意味がありません!
 
OrdersTotalを 直接使用したり、OrderSelect ループでマジックナンバーフィルタリングを行わない場合、あなたのコードはすべてのEA(他のチャートやマニュアル取引での自身を含む)と互換性がありません。別のチャートに別の通貨を追加した場合、シンボルがOrdersymbolと一致しない ...- MQL4フォーラム
 
Fernando Carreiro:

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

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

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


    for(int i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
         if(OrderMagicNumber()==MagicNumber && OrderSymbol()==Symbol()) continue;
         //---Check Order Type
         if(OrderType()==OP_BUY)
         {
           if(fastma < slowma)
           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }
           else
            Print("Error : ", GetLastError());
            return(0);
           break;
         }
      if(OrderType()==OP_SELL)
        {
          if(fastma > slowma)
          {
             if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
            
          }
          else
               Print("Error : ", GetLastError());
               return(0);
          break;
        }

      } 

これはOrderCloseセクションで、Invalid ticketエラーは出なくなりましたが、Invalid priceが出るようになりました。

これはログから直接です

2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1: invalid price 1.05454000 for OrderClose function(オーダークローズ関数が 無効な価格です。


 
Matt_Townsend:

           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }

...

         {

             if(OrderClose(OrderTicket(),Lots,Ask,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);

 

OrderCloseセクションで、Invalid ticketエラーは出なくなったが、Invalid priceが出るようになった。

以下はログから直接です。

2016.12.09 10:47:10.243 Simple Moving Average Crossover Strategy EURUSDi,H1: invalid price 1.05454000 for OrderClosefunction(オーダークローズ関数に無効な価格があります。


クローズ時にBid/Askを使用せず、OrderClosePrice()を使用してください。これは自動的に良い価格になります。
 
Alain Verleyen:
クローズ時にBid/Askを使用しないで、OrderClosePrice()を使用してください。これは自動的に良い価格になります。

OrderClose関数で置き換えればいいのでしょうか?また、その場合、その下のprint関数 でOrderClosePriceを削除すればいいのでしょうか?

編集してください。

私はちょうどそれをしました、しかし今それはどのポジションも開いたままではありません。ただ、ポジションを開いたり閉じたりするだけで、複数のペアで動作することに問題はありません。

 

         if(OrderType()==OP_BUY)
         {
           if(fastma < slowma)
           {
             if(OrderClose(OrderTicket(),Lots,Bid,10,clrNONE))
             Print("Order Closed : ", OrderClosePrice());
             return(0);
           }
           else
            Print("Error : ", GetLastError());
            return(0);
           break;
         }

ループを完了させる必要があるため、リターンやブレークは必要ありません。

また、このエラー表示は


           if(fastma < slowma)


が false であることに依存しており、OrderClose() が失敗したかどうかには関係しません。



   if(OrderType()==OP_BUY)
     {
      if(fastma<slowma)
        {
         if(OrderClose(OrderTicket(),Lots, OrderClosePrice(),10,clrNONE))
            Print("Order Closed : ",OrderClosePrice());
         else
            Print("Error : ",GetLastError())
        }
     }