複数注文の問題 - ページ 2

 

こんにちは、Raptorです。

TesterではTrailingStopが閉じると全ての注文が閉じますが、DemoではTrailingStopによって閉じられた注文だけが閉じ、開いている注文はまだ開いたままです。

アドバイスいただいたコードに次のコードを追加すると、ロジックは次のようになります。

"最後の注文の条件を見つけ、もしクローズであったなら、残りのすべてのオープンオーダーのクローズを開始するコードを実行する。"

なぜこのようなことが起こるのでしょうか?

よろしくお願いします。

ルイス

int OrdType, GLError;
   double OrderClosed;
   RefreshRates();
   
    for(int Closed = OrdersTotal()-1;Closed >= 0; Closed--) 
      if(OrderSelect(Closed,SELECT_BY_POS,MODE_HISTORY)
        && OrderMagicNumber()== MagicNumber
        && OrderSymbol()== Symbol())
        {//29
        OrderClosed = OrderCloseTime();
        if(OrderClosed!=0)
           {//30                                  
   for(int OrderPos = OrdersTotal()-1; OrderPos >= 0; OrderPos--)       
      if(OrderSelect(OrderPos, SELECT_BY_POS, MODE_TRADES)
         && OrderMagicNumber()== MagicNumber 
         && OrderSymbol()== Symbol())                                       
         {//31
         OrdType = OrderType();
         if(OrdType == OP_BUY || OrdType==OP_SELL)
           {//32
           if(!OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(),RealSlippage, Yellow))
               GLError = GetLastError();
           }//32                                         
          }//31
       }//30
     }//29 
    
  if(GLError > 0) Print("Error Closing/Deleting Order, error # ", GLError, " for ticket: ", OrderTicket());           
  return(0);
  }//0 
 
luisneves:

こんにちは、Raptorです。

TesterではTrailingStopが閉じると全ての注文が閉じますが、DemoではTrailingStopによって閉じられた注文だけが閉じ、開いている注文はまだ開いたままです。

アドバイスいただいたコードに次のコードを追加すると、ロジックは次のようになります。

"最後の注文の条件を見つけ、もしクローズであったなら、残りのすべてのオープンオーダーのクローズを開始するコードを実行する。"

なぜこのようなことが起こるのか、何か手がかりはありますか?

このようなことはできません ... ...

    for(int Closed = OrdersTotal()-1;Closed >= 0; Closed--)    // OrdersTotal is the total of open orders
      if(OrderSelect(Closed,SELECT_BY_POS,MODE_HISTORY)        //  this is looping through the closed orders

これは、未決済注文の 数をループの開始条件として使用して、決済された注文 をループするのは意味がありません。 たぶん、OrderssHistoryTotal() を使用するつもりだったのでしょ うか? しかし、 決済済みの注文の OrderCloseTime() は決して == 0 にならないでしょう。

 
luisneves:

.....

複数の注文を出すのを避けるために、コード内でBuyTicketとSellTicketを使っているのですが、どうやらこの方法は正しくないようです・・・。

.....

問題は、3つ目の 注文を開く条件が来たときなどです。それなのに、2回目の注文はうまくいったのに、3回目の注文はうまくいかないのはなぜだろう?

最初のトピックを少し変更されたとのことですが、最初の問題は最後まで議論されているのかもしれません(私はそれでいいと思います)。
もしまだ最初の問題のフォローアップをしたいのであれば、もう少し他の説明をしなければなりません。

私が調整した最初のスニペットは、コードが複数の注文を開くことを防ぐことができます。あなたはそれに満足していないようなので、それを削除(または単に追加しない)し、BuyTicketとSellTicketを使用して同様のことを行っています。
そうすると、3回目の注文の話になってしまいますが・・・。こんな感じで探しているのでしょうか?

買い->売り->買い->売り->買い
を防いで
買い->買い->売り->買い->買い

言い換えれば、最後に開いた注文が買い 注文であれば、次は売り注文でなければならず、逆もまた然りということでしょうか?

あるいは、EAが開くべき注文の最大量は何ですか?2つで、1つは売り、反対注文の条件を満たせば買い、再び買いトリガーから跳ね返されたらもう売りは出さないということでしょうか?
もしそうなら、私があなたの最初のコードに追加した OpenOpposite カウンターには何か問題があったのでしょうか?

を編集します。

3番目の選択肢は、最初の反対売買注文がストップアウトしたときに、別の反対売買注文をオープンすることでしょうか?
つまり、このように。

買い->売り->売りがストップしている場合->売り->売りがストップしている場合->売り

 
kronin:

私はあなたが少し最初のトピックを変更し、多分最初の問題は、その終わりまで議論されている理解しています(それは私のために大丈夫です)。
あなたがまだ最初の問題をフォローアップしたい場合は、私は本当にあなたが探しているものを理解していないため、あなたはそれを少し他に説明する必要があります。

私が調整した最初のスニペットは、コードが複数の注文を開くことを防ぐことができます。あなたはそれに満足していないようなので、それを削除(または単に追加しない)し、BuyTicketとSellTicketを使用して同様のことを行っています。
そうすると、3回目の注文の話になってしまいますが・・・。こんな感じで探しているのでしょうか?

買い->売り->買い->売り->買い
を防いで
買い->買い->売り->買い->買い

つまり、最後に開いた注文が買い注文であれば、次は売り注文でなければならず、その逆もまた然りということでしょうか?

あるいは、EAが開くべき注文の最大量は何ですか?2つで、1つは売り、反対注文の条件を満たせば買い、再び買いトリガーから跳ね返されたらもう売りは出さないということでしょうか?
もしそうなら、私があなたの最初のコードに追加した OpenOpposite カウンターには何か問題があったのでしょうか?

を編集します。

3番目の選択肢は、最初の反対売買注文がストップアウトしたときに、別の反対売買注文をオープンすることでしょうか?
つまり、このように。

買い->売り->売りがストップしている場合->売り->売りがストップしている場合->売り


こんにちは、Kronin。

お忙しいところありがとうございました。

戦略はこのようなロジックで行われます。

例えば、最初の注文は買いで、TrailingStopで決済しようとしますが、BidがOrderOpenPrice(ReturnDistance)の下で何pipsか跳ねたら売りが開き、TrailingStopで決済しようとし、再びAskがOrderOpenPriceより数pips跳ねたら買いが開くとします。このピンポンのプロセスは、最後に開いた注文がTrailingStopの平均値で閉じるか、最大注文数である7に達すると終了します(外部で調整することも可能です)。

複数の注文を出す場合の問題は、価格がOrderOpenPriceを越えて上昇したり下降したりするときに発生します。

前回のヘルプについてですが、おそらく私の問題が何であったかをうまく説明できていなかったと思います。どのようなヘルプでも、私にとって最も価値のあるものです。

よろしくお願いします。

ルイス

 

ルイス、私はあなたのコードにかなり多くの時間を費やしたが、正直なところ、私はあなたが望むものを行うことを本当に確信していない。

添付ファイルを参照してください。 最終化/変更、テスト、理解...そして、少なくともあなたが探しているものに近い、類似した、または完全な他の動作していることを教えてください。私はまだ戦略についてよく分かっていません。
まだ新しい機能を 追加しないでください(マーチンゲールを再追加しないでください)。コードは十分に大きく、信頼性のある動作をさせるために、まだ多くの作業が残っています。
私は、コードがこれほど明確に配置されていないと言わざるを得ません。私はあなたの実行部分を変えたくありませんでした(より良いエラー処理が必要であることは言うまでもありません)。コメントした部分と移動した部分がありますが、すべてそのままです...。


楽しんでください...

ファイル:
 
kronin:

ルイス、私はあなたのコードにかなり多くの時間を費やしたが、正直なところ、私はあなたが望むものを行うことを本当に確信していない。

添付ファイルを参照し、最終的に変更し、テストし、理解し...そして少なくともあなたが探しているものに近い、類似または完全な他の動作している教えてください。私はまだ戦略についてかなり確信していません。
まだ新しい機能を追加しないでください(マーチンゲールを再追加しないでください)。コードは十分に大きく、信頼性のある動作をさせるために、まだ多くの作業が残っています。
私は、コードがこれほど明確に配置されていないと言わざるを得ません。私はあなたの実行部分を変えたくありませんでした(より良いエラー処理が必要であることは言うまでもありません)。コメントした部分と移動した部分がありますが、すべてそのままです...。


楽しんでください...


こんにちは、Kronin。

すべての私のアップの前に、私の問題のサポートに費やされた時間に最も感謝します。

私はあなたが戦略を理解するために最善を尽くしたと信じていますが、いくつかのことは非常に応答していない(もちろん、この問題で私の理解不足のため)。

アドバイスにしたがって、いくつかの改造をしましたが、正しくできているかどうかわかりません。

2つの問題。

1 - TrailingStopによって取引が終了したら、残りの未決済注文をすべてクローズするというものです。注文はTakeProfitで閉じるべきではありません(そのTakeProfitは、私がフリーズゾーンに置かれることを確認したいので、そこにあるだけです)。そこで、最後の注文のクローズを使ってCloseAll関数を実行することを考えた(やろうとするとバカなことが起きるのだが・・・)。Last Closed Ticket を使って注文のクローズを実行しているようですが、TrailingStop を使ってトレードをクローズしたときにそうなるのかどうか、よくわかりません...。

2 - "ping pong "は少なくともTesterでは機能していません。

添付ファイルには、私が理解する限りにおいての修正が行われたファイルがあります。

あなたの忍耐と時間を費やしていただき、ありがとうございます。(詳しくはプライベート メッセージで)

よろしくお願いします。

ルイス

ファイル:
 

OK、私はすべての注文をTPの代わりにSLでクローズするようにアルゴリズムを変更しました。(変更は'<'を'>'に置き換えたものです。)どこが変わったか調べてみてください。

ピンポンは私にとっては動作しますし、テスターでビジュアルモードでしか動作させていません。しかし、私はすべての注文がほとんど同時に開くことがないように入力パラメータを調整しました。多分、あなたはデフォルトのパラメータを確認する必要があります。

最初の注文から始まり(print()文を変更しました)、逆の注文をします。

EURUSD,M1: open #1 buy 0.01 EURUSD at 1.43310 ok
EURUSD,M1: 最初の買い注文が出ました # 1
EURUSD,M1: 1.43310の#1買い0.01 EURUSDを修正 sl: 1.42810 tp: 1.43510 ok
EURUSD,M1: 開く #2 sell 0.01 EURUSD at 1.43200 ok
EURUSD,M1:反対方向の売り注文を 発注 # 2
EURUSD,M1: 1.43200で#2売り0.01 EURUSDを修正 sl: 1.43700 tp: 1.43000 ok
EURUSD,M1: 開く #3 buy 0.01 EURUSD at 1.43300 ok
EURUSD,M1:反対方向の買い注文を発注 # 3
EURUSD,M1: 修正#3買い0.01 EURUSD at 1.43300 sl: 1.42800 tp: 1.43500 ok

OpenOppositeOrder()で注文を出した時にreturnを追加しています。設定と合わせて、買い注文と同じティックで売り注文を開くことが可能でした。このMaxOrderへの導線は信頼性がありません。
多分、より良いアプローチは、2つの関数にそれを分割するか、関数にパラメータを与えて、売り注文または買い注文に対してのみ実行することだと思います。

あなたがアップロードしたコードは取引しませんでした!すべての取引は'invalid LotSize'のために失敗しました....

 

Kroninさん、こんにちは。

サポートに時間を割いていただきありがとうございました。

アップロードされたコードは取引されませんでした!すべての取引は'無効なLotSize'のために失敗 しました。「については、MMコードをファイルの最後に移動した後に発生しました。MM();を使った関数の 呼び出しをコードの先頭で行ったのですが、このような動作はしないようです。しかし、最後に送っていただいたコードは動作しており、MM()関数も同じ場所にあり動作しているので、ここで迷っています...。

同じティックで注文を出すことについて。

EAがチャートに入ったとき、その時点の価格よりも高く(あるいは低く)なるようにしなければなりません。つまり、価格が上昇(あるいは下降)したときに、OpenDistanceで買い(あるいは売り)注文が行われるのです。ここから次の注文は、OrderOpenPriceからReturnDistanceを引いた値で価格が跳ね下がった時(最後の注文が買いの場合)に出すことができます。このロジックから外れるような注文が出ないように、指値をしておく必要があるかもしれません。

よろしくお願いします。

ルイス

 
//mine
LotSize = (RiskAmount / StopLoss) / TickValue;              //Phil: LotSize is defined in global scope

//yours
double LotSize = (RiskAmount / StopLoss) / TickValue;


グローバルスコープでLotSizeを定義し、それを0に初期化しました。 void MM()関数 内で、その関数内でのみ有効なLotSizeを計算しました。私は初期化を削除しただけなので、グローバルスコープの変数は更新されます。

それぞれの値について、Pipsでの値をコメントしていただけませんか?

extern double StopLoss       =  50;
extern double TakeProfit     =  20;
extern double TrailingStop   =   2;
extern int    MinimumProfit  =   3;
extern int    Slippage       =   3;
extern double OpenDistance   =   2;
extern double ReturnDist     =   1;
extern double MinStop        =   1;

EAを走らせたいSymbolのスプレッドはどのくらいでしょうか?

しかし、私はあなたの入力パラメータを調整して、すべての注文がほとんど同時に開くことがないようにしました。多分、デフォルトのパラメータを確認する必要が あります。

同じようにして、テスターでビジュアルモードで動かしてみてください。

 
kronin:


グローバルスコープでLotSizeを定義し、それを0に初期化しました。 void MM()関数内で、その関数内でのみ有効なLotSizeを計算しました。私は初期化を削除しただけなので、グローバルスコープの変数は更新されます。

それぞれの値について、Pipsでの値をコメントしていただけませんか?

EAを走らせたいSymbolのスプレッドはどのくらいでしょうか?

しかし、私はあなたの入力パラメータを調整して、すべての注文がほとんど同時に開くことがないようにしました。多分、デフォルトのパラメータを確認する必要が あります。

同じようにして、テスターでビジュアルモードで動かしてみてください。


Kroninさん、こんにちは。

はい、私は学ぶことがたくさんあります...今、グローバルでなければならない関数の外側からアクセスする値の必要性があるときに理解することができます。

EAは5桁のブローカーで動作する必要があるため、外部にある値は10倍されます。私はそれを自動的に得るためにコードのこのブロックを使用していますが、金属と互換性がないWHRoederから助言を得ることができます。

int init ()// Adjust for 4 or 5 digits.
   {
   if (Digits == 2 || Digits == 4) <------- not compatible with metals
      {
      pt = Point;
      RealSlippage = Slippage;
      }    
   if (Digits == 3 || Digits == 5) 
      {
      pt = Point * 10;
      RealSlippage = Slippage * 10;
      }

ペアのスプレッドは変動する可能性があります。そのため、Stop Levelから 抜け出すためのコードを使用しています。

この問題については、「しかし、私は、すべての注文がほとんど同時に開かないように、あなたの入力パラメータを調整 しました。多分、デフォルトのパラメータを確認する必要があります。"

私が見る限り(違っていたらすみません)、OpenDistanceは2pips、ReturnDistanceも2pipsで維持されています。今見ているのは、注文は開くのですが、2pipsの差では開きません。これはECNブローカー(IC Markets)のプラットフォームからテスターで実行しています。これは何らかの重要性を持っているのでしょうか?

実際、注文は同時に開きませんが、Open Distance と ReturnDist が、注文を開くのに適切な距離を得るために考慮されていないようです。

あなたはコードに次のように記述しています。

OTLastTick=OTCurrentTick;                      //shift OrderTotal
  OTCurrentTick=OrdersTotal();                   //reinit OrderTotal
  if(OTCurrentTick>0)Trail();                    //Trail
  if(OTLastTick>=2                               //if OrderTotal has changed
     &&OTCurrentTick<OTLastTick
     &&OTCurrentTick>0){CloseAllOnSL();return;}  //Check order closed on SL level
  if(OTCurrentTick>=MaxOrders)return;            //Dont open more orders. Trail and return.
                                                 //Actually we have nothing more to do.
                                                 //Only call opposite if the initial order of the serie is open
  if(OTCurrentTick>0)OpenOppositeOrder(); //<--------------------- include this line to call function (not sure if this the right method to do it...)
  MM();                //<--------------------- include this line to call function (not sure if this the right method to do it...)
                        
  if(OTCurrentTick==0){//init serie
     BuyAllowed=true;
     SellAllowed=true; 

私は関数OpenOppositeOrderを呼び出すために太字で行を含めると、ここでは、これが正しいかどうかはわからない。一方、2pips前に起こった最後のティックと現在のティックの比較(OpenDistance)はどこにあるのかがわかりません。

私の問題であなたを退屈させ始めたら申し訳ありません。

よろしくお願いします。

Luis