[ARCHIVE!] フォーラムを散らかさないように、どんなルーキーの質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしではどこにも行けない - 4. - ページ 514

 
Jony5Proz:

こんにちは。

EAについて、こんな質問があります。

スイングで注文を出しているのですが、例えば、MA_1 > MA_2 ならば、買います。しかし、私が取引を終了すると、このルールは再びトリガーされます。

MA_2から4本以上離れていない場合にのみポジションを建てるようにEAに指示するにはどうしたらよいですか?


ありがとうございました。

何かが間違っていたり、場所が間違っていても、私を蹴らないでください。この巨大なフォーラムに初めて投稿します。

https://book.mql4.com/ru/samples/expert
 

どうも、その程度の知識しかないんです。例のスクリプトにも同じ問題があります。スクリプトをオンにすると、トレンドの最後に入るので不便です。

2本のバーが交差した後、4本以下のバーがある場合にのみトリガーするようにスクリプトを指示するにはどうすればよいですか?

 
https://www.mql5.com/ru/code/10773 最終回入浴
 
Jony5Proz:

どうも、その程度の知識しかないんです。例のスクリプトにも同じ問題があります。スクリプトをオンにすると、トレンドの最後に入るので不便です。

2本のバーが交差した後、4本以下のバーがある場合にのみトリガーするようにスクリプトを指示するにはどうすればよいですか?

スクリプトは言葉を理解しない。2本のMAがクロスした後、4小節以内にスクリプトを実行することです。
 

皆さん、新しいローソク 足が出たときだけ注文を出す方法は、すでにここで質問しています。D1タイムフレームを使用しています。

私は、過去のローソク足の分析から、あるレベル(buystop_lvl と sellstop_lvl )に保留注文を置くことにしました。

保留中の注文が有効になっているかどうかは関係なく、有効になっているならば成行注文も閉じているはずです。注文は最大でbuystopとsellstopの2つです。

以下は、私が書いたものです。

1.まず、成行注文や未決済注文が有効かどうかを確認し、有効であれば削除・決済を行う。

int total=OrdersTotal();
   if (total!=0 && NewBar()==true){
                 for (int i=0; i<total; i++)
                    {
                     OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
                     if(OrderType()==OP_BUY)  OrderClose(OrderTicket(),OrderLots(),Bid,10);
                     if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,10);
                     if(OrderType()==OP_BUYSTOP)  OrderDelete(OrderTicket());
                     if(OrderType()==OP_SELLSTOP) OrderDelete(OrderTicket());
                    }
                }

2.そして、計算されたレベルにより、保留の注文を出す。

if(NewBar() == True && OrdersTotal()==0)
    {
     OrderSend(Symbol(),OP_BUYSTOP ,Lot,buystop_lvl ,10,buystop_SL ,buystop_TP,"Expert buystop\sellstop");
     Sleep(10000);
     OrderSend(Symbol(),OP_SELLSTOP,Lot,sellstop_lvl,10,sellstop_SL,sellstop_TP,"Expert buystop\sellstop");
     
    }

3.私が実装したNewBar関数(NewBar)。

//Функция нового бара
bool NewBar()
{
  static datetime lastbar = 0;
  datetime curbar = iTime(Symbol(),1440,0);
  if(lastbar != curbar)
  {
    lastbar = curbar;
    return(true);
  }
  else return(false);
}

その結果、新しいローソク足が開くと、注文が発注され、すぐに削除されます。発注してすぐに削除される。

(1)のコードをコメントアウトすると、テスターでは注文が開かない、つまり成行注文にならないのですが、どうすればいいのでしょうか?

何が問題なのか、教えてください。

 

このNewBar()関数は、2回連続で使用できません。

こんな感じのものが良いですね。

bool newBar = NewBar();

// さらに本文中では、NewBar()をnewBarに置き換えています。

 
しまった、まだやり方がわからない。次のローソク足でのみ注文を削除し、決済するコードが必要です。しかし、その上に開くのはまた別の人たちです。これは、プログラムが再び削除に入ることを意味します。フラッグが必要ですが、どうすればいいのか、すでに脳に汗をかいています :)
 
Noterday:
そして一般的には、NewBarを捨てて、最後の注文の開始時刻を見て、Time[0]と比較するのです。もっと高ければ、自分の場合、全部削除していいんですよ。
 
trend_lab:
そして一般的には、NewBarを捨てて、最後の注文の開始時刻を見て、Time[0]と比較するのです。もっと高ければ、自分の場合、全部削除していいんですよ。

そうですね、やるしかないでしょうね。ありがとうございました :)
 
Noterday:
男、まだやり方がわからない。注文の削除と決済が次のローソク足でトリガーされるようなコードが必要です。しかし、他のローソク足もこの上で開くはずです。これは、プログラムが再び削除に入ることを意味します。何らかのフラグが必要なのですが、その方法を理解するのに既に脳に汗をかいています :)

OrderSend() 関数をよく読んでください。保留中の注文のパラメータがある。

expiration - Срок истечения отложенного ордера.

現在の日=iTime (Symbol(), PERIOD_D1, 0)の最初に保留注文を出すと、この時間にさらに1日-1440 * 60を追加することになります。保留中の注文は、トリガがかからないと、翌日の初めに勝手に削除されます。

追伸:現在のバーの終わりは、関数iBarShift()によっても制御可能です。

    if (iBarShift (Symbol(), PERIOD_D1, OrderOpenTime()) == 0) return(0);

など、この条件での「体の動き」を、最後の注文のOrderTicket()をたどることで、確認することができます。