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

 
GumRai:

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

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

GumRaiさん、早速のご回答ありがとうございます。 私のプログラムには、以下のような条件がたくさんあります。P12まで確認しました。これはピボットのようなものです。P1、P2、...と12個あるので、条件を満たせば、そのレベルで指値売買をします。いちいち売り買いのコードを書くのは面倒なのでそのため、buycallとsellcallの関数を 別々に作りました。以下は、私の古い売りコードである。

     if( P1 == 1 || P1 ==5 || P1 ==7)
      {
      if ( BuyTicket == 0)
      BuyCall(S0);
      }    
     if( P2 == 1 || P2 ==5 || P2 ==7)
      {
      if ( BuyTicket == 0)
      BuyCall(S1);
      }  
         .......................many more
 
int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
  if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,expiration,Red);
   BuyTicket = 0; 
   // counter tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       SellTicket = 0;
       }
   }
  } 
 }
   return(SellTicket);
}
 

これがその例です。同じトレードを各ティックに配置する。これを各時間に配置する必要があります。1時間ごとのピボットなので

 
int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
  if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,expiration,Red);
   BuyTicket = 0; 
   // counter tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       SellTicket = 0;
       }
   }
  } 
 }
   return(SellTicket);
}

売り 指値をするとき、BuyTicketを0に設定します。

次にBuyTicket=0かどうかをチェックします。もちろん、今設定したのですから0です。

次にSellTicketを0に設定します。

次のティックでは、Sellticket=0なので、売り指値を開き、BuyTicketを再び0に設定します。

といった具合に..........................。

 
GumRai:

売り指値をするとき、BuyTicketを0に設定します。

次にBuyTicket=0かどうかをチェックします。もちろん、今設定したのですから0です。

次にSellTicketを0に設定します。

次のティックでは、Sellticket=0なので、売り指値を開き、BuyTicketを再び0に設定します。

といった具合に..........................。

では、ハイライトした2行を削除すればいいのでしょうか。そうしました。2ヶ月のデータのバックテストで、1時間だけの結果を表示しています。

もう一つ気づいたのは、私のセルコールでは、買いの逆張りをしていることだ。もし売りがストップアウトしたら、買いのトレードを開始します。今、sellcall関数の ためにそれは(Selltickets)を返すので、それは大丈夫ですか?

ありがとうございます。

 

int SellCall(double SC)
{

if(!OrderSelect(SellTicket, SELECT_BY_TICKET))
  {    
   if( SellTicket == 0)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,0,Red);
   
   // reverse tradee //
   if ( Ask > SellStopLoss && BuyTicket == 0)
   {   if(!OrderSelect(BuyTicket, SELECT_BY_TICKET))
       {
       BuyStopLoss = Ask - (StopLoss * CalcPoint1);
       BuyTakeProfit = Ask + (TakeProfit *  CalcPoint1);
       BuyTicket = OrderSend(Symbol(),OP_BUY,LotSize,Ask,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);
       
       }
   }
 } 
 }
   return(SellTicket);

このコードで理解したのは、最初にsellticket == 0 をチェックし、yes obviousで売り注文を出し、次にbuyticket == 0 yesで買い注文を出す・・・しかし、戻ると・・・再びsellticket == 0 をチェックし、no its not now・・・だからEaは1セット取って止まったということです。しかし、この問題を取り除くにはどうしたらいいのだろう。私のEAでは、開始時間から59分ごとに非稼働中の注文が削除されます。そのように設定しています。

 

現在、以下のようにコードを変更し、すべてのサポートとレジスタンスを読み取るようにしました。

私は1時間に最大6つのサポートとレジスタンスを持っています。この6つのうち条件を満たしたものに指値注文を出し、1つでも条件を満たせばそのものに指値注文を出す。これがアルゴだ。

ということで、以下のように関数 呼び出しのコードを設定した。

int BuyCall( double BC)
{  
      
if ( BuyTicket >= 0 && BuyTicket <= 5)
  {
   BuyStopLoss = BC - (StopLoss * CalcPoint1);
   BuyTakeProfit = BC + (TakeProfit *  CalcPoint1);
   BuyTicket = OrderSend(Symbol(),OP_BUYLIMIT,LotSize,BC,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy limit Order",MagicNumber,TimeCurrent()+3540,Green);
    
   }   
return(0);
}

int SellCall(double SC)
{
  
 if( SellTicket >= 0 && SellTicket <= 5)
   {
   SellStopLoss = SC + (StopLoss * CalcPoint1);
   SellTakeProfit = SC - (TakeProfit * CalcPoint1);
   SellTicket = OrderSend(Symbol(),OP_SELLLIMIT,LotSize,SC,UseSlippage,SellStopLoss,SellTakeProfit,"Sell Limit Order",MagicNumber,TimeCurrent()+3540,Red);
  
   } 
   return(0);
}

これで1時間実行され、6段階の売買がチェックされる。しかし、実行時間はたったの1時間。完全なデータセットで実行するにはどうしたらいいでしょうか。

 
if ( BuyTicket >= 0 && BuyTicket <= 5)

これはストラテジーテスターでのみ 機能し、最初の6つの注文がオープンされるとそれ以上何もしません。

この方法では、テストにチケット番号を使用することはできません。

 
GumRai:

これはストラテジーテスターでのみ機能し、最初の6つの注文がオープンされるとそれ以上何もしません。

この方法では、テスト用のチケット番号を使用することはできません。

ご返答ありがとうございます。

では、どうすればよいのでしょうか。BuyTicket =>0やBuyTicketの条件を外すと。EAがティック 毎に同じ取引を繰り返しています・・・148のordersendエラーが出ます。

 
cashcube: では、どうすればいいのでしょうか。
前回までの回答
 
cashcube:

ご返信ありがとうございます。

では、どうすればいいのでしょうか。BuyTicket =>0やBuyTicketの条件を外すと。148のオーダーエンドエラーが出てしまいます。

あなたが何をしようとしているのかわかりません。

一度に 1 つのオープントレードしか行わない場合、新しい注文を出す前にオープンオーダーがないことを確認 します。

1 つのバーに 1 つの取引しか行わない場合、1 つのバーに 1 回だけテストします。

条件の組み合わせが必要な場合は、その組み合わせをテストしてください。