Eaが複数の同じ保留/制限注文を作成している [Help pls] 。

 

こんにちは、Eaを作りましたが、バックテストをすると、各ティックで同じ保留中の注文が多数作成されます。どうしたらそれを止められますか?私は一度に一つの注文が必要なだけで、そのコピーは必要ありません。

このEAを1時間足チャートで"open price only"で実行すると、コピーは作成されません。

さらに、私のEAは、買い指値が失敗した場合、売り指値を開く反転取引のオプションを持っています。また、私はそれを適切に設定されているかどうかを教えてください。どんな助けでも感謝されるでしょう。

あなたの時間をありがとうございます。

// Main function//
if(condition)
   {
     if( condition )
      {
      if ( BuyTicket == 0)
      BuyCall(S0);
      }    
     if( condition)
      {
      if ( BuyTicket == 0)
      BuyCall(S1);
      }  

   etc etc... // many conditions
}

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{  
   if ( BuyTicket == 0)
   {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;

   // reverse trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
     }    
   }
      
return(BuyTicket);
}
 
cashcube: それを止めるには。
どのように考えているのですか?新しいものを開く前に、すでに終了しているものをチェック するのです。
 
WHRoeder:
キャッシュキューブ それを止める方法。
どう考えるか?新しいものを開く前に、すでに終了しているものをチェックするのです。

それからどうする?buyticket == 0 & sellticket == 0のコードを削除 する?
 
EAは復旧するようにコード化されていなければなりません。電源が落ちたり、OSがクラッシュしたり、ターミナルやチャートが誤って閉じられたりすると、次のティックで、静的/グローバルチケット変数がすべて失われています。あなたは未決済の注文を持っていますが、それを知らないので、EAは決してそれを閉じようとせず、SLなどを追跡します。どのように回復するのでしょうか?OrderSelect ループを使用して回復するか、チケット番号の永続的な保存 (GV/file) が必要です。
 
WHRoeder:
EAは復旧するようにコード化されていなければなりません。電源が落ちたり、OSがクラッシュしたり、ターミナルやチャートが誤って閉じられたりすると、次のティックでスタティック/グローバルチケット変数がすべて失われることになります。あなたは未決済の注文を持っていますが、それを知らないので、EAはそれを閉じようとせず、SLなどをトレールしません。どのように回復するのでしょうか?OrderSelect ループを使用して回復するか、チケット番号の永続的な保存 (GV/file) が必要です。

こんにちは、以下のようにコードを変更して追加しました。

//---------------------- Buy/Sell function (limit orders)
int BuyCall( double BC)
{  
  if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
    {      
  if ( BuyTicket == 0)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;
   // counter trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        if(!OrderSelect(SellTicket, SELECT_BY_TICKET) == true)
        {
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
        }
     }    
  }
 }

まだ、同じ注文をティックごとに何度も受けています。

さらに、"!"記号を削除すると、それはどんな取引も取らない。

最後に、私のメイン関数からbuyticketとsellticketのチェックを削除しなければならないのでしょうか?

ありがとうございます。

 
if(!OrderSelect(BuyTicket, SELECT_BY_TICKET)==true)
  1. コードを貼り付けないでください
    動画を再生する
    投稿を編集して ください。
    大量のコードについては、それを添付して ください。

  2. if( (2+2 == 4) == true) とは書かないですよね?if(2+2 == 4) で十分です。だから、if(bool == true) なんて書かないで、if(bool)if(! bool)を使えばいいんです。bool isLongEnabledのように意味のある変数名を使えば、コードは自己文書化される。Long_Entryはトリガー価格かチケット番号のように聞こえるし、"if long entry "は不完全な文です。
  3. BuyTicketが クローズしたかどうかはどこで確認するのですか?チケットで選択すると常に真になります(有効なチケット番号がある場合)、注文は保留、オープン、クローズ、削除のいずれかになります。
  4. OrderSelect ループを提案した私の提案を完全に無視しています。
 

こんにちは、WHRederさんご返信ありがとうございます。

はい、SRCコードにそれらを追加しました。しかし、編集しても表示されませんでした。

ご指摘の通り、==trueの項を削除してみました。

誤解しないでください、私はこのorderselectループを理解するのが弱いのです。無視したわけではありません。私はそれを追加しようとしましたが、それはあまりにも複雑で、実行すると16のエラーと2つの警告が表示されます。 このコードでは、MN.Countとは何ですか?

// extern int     Magic.Number.Base          = ...
// int      magic.number.max;                   // Export to OpenOrder/MySelect
// string   market.pair;                        // Export to OpenOrder/MySelect
// int init(){
//    market.pair       = Symbol();
//    magic.number.max  = Magic.Number.Base + MN.COUNT - 1;

購入チケットのクローズチェックについて。現在の価格がbuystoplossを下回っていれば、買いの取引は終了しているので、売り注文を 出したので、チェックはしていません。

 Bid < BuyStopLoss 

ご指摘の通りです。

 

しかし、2つのエラーが表示されます。"Myselect" と "MyOrdersTotal" はグローバルスコープでのみクリアされます。

int BuyCall( double BC)
{  
//-----------code
bool MySelect(int iWhat, int eSelect, int ePool=MODE_TRADES){
   if(!OrderSelect(iWhat, eSelect, ePool) )  return (false);
   int      mn = OrderMagicNumber();
   if(mn < MNB1              )  return (false);
   if(mn > MNB2               )  return (false);
   if(OrderSymbol()      != Pair   )  return (false);
   if(ePool != MODE_HISTORY               )  return (true);
   return(OrderType() <= OP_SELL); 
                                   
                                   
}
int MyOrdersTotal(int op=-1, int ePool=MODE_TRADES){   #define  OP_ALL -1
   if(ePool == MODE_TRADES)            iPos = OrdersTotal()        - 1;
   else                                iPos = OrdersHistoryTotal() - 1;
   for(nOrders=0; iPos >= 0; iPos--) if(
      MySelect(iPos, SELECT_BY_POS, ePool)) if(
      op == OP_ALL || op == OrderType()
   )  nOrders++;
   return(nOrders);
}

  if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
    {      
  if ( BuyTicket == 0)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,expiration,Green);
   SellTicket = 0;
   // counter trade//
     if( Bid < BuyStopLoss && SellTicket == 0 )
     {  
        if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
        {
        SellStopLoss = Bid + (StopLoss * CalcPoint1);
        SellTakeProfit = Bid - (TakeProfit * CalcPoint1);
        SellTicket = OrderSend(Symbol(),OP_SELL,LotSize,Bid,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Order",MagicNumber,0,Red);
        BuyTicket = 0;
        }
     }    
  }
 }
      
return(BuyTicket);
}
 
他の関数の内部で関数を 宣言することはできません
 
GumRai:
他の関数の中で関数を宣言することはできません

では、どうすればいいのでしょうか。というのは、売買注文 を出すために個別にチェックすべき条件がたくさんあるんです。

だから、buycall/sellcall関数を作って、コードを簡単にしたんだ。

ただ、EAが同じようなトレードを何度もしているんだ。それを止める方法がわからない。

 
GumRai:
他の関数の内部で関数を宣言することはできません。

cashcube:

では、どうすればいいのでしょうか。というのは、売買注文を出すために個別にチェックすべき条件がたくさんあるんです。

だから、buycall/sellcall関数を作って、コードを簡単にしたんだ。

ただ、EAが同じようなトレードを何度もしているんだ。それを止める方法がわからない。

まず第一に、他の関数の中で関数を 宣言しようとしないでください。

私はあなたが投稿したコードを見ることによって、あなたがやろうとしていることを理解することはできません。だから、私はあなたを助けることができません。

理由: