int start()
{
if(OpenOrdersThisPair(Symbol())>0) //If there is a trade open = do below, which ever is applicable.
{
if(OrderType()==OP_BUY && OrderOpenPrice() > OrderStopLoss())
{
CloseHalfOrder(); // Closes half at 1:1 - then calls another void to break even on the trade +3.
}
if(OrderType()==OP_SELL && OrderOpenPrice() < OrderStopLoss())
{
CloseHalfOrder1(); // Closes half at 1:1 - then calls another void to break even on the trade +3.
}
}
}
私は上に貼り付けたように、私は半分の順序は、OrderTicket()が何であるかに関係なく、ANYオープン "OP_BUY "が何度も何度も呼び出されるのだろうか?
私は "in start() "と上記のコードの中で、それはすでに半分を閉じた後に毎回 "OP_BUY "を呼び出し続けることはありませんようにコードを記述する方法が必要ですか?
申し訳ありませんが、それがどのように私を助けるのか全く理解できません。forループで何が起こるか、呼び出されるvoidは重要ではありません。int start()」で最初に何を呼び出すかが問題なのですね。私は上に貼り付けたように、私は半分の順序は、OrderTicket()が何であるかに関係なく、ANYオープン "OP_BUY "が何度も何度も呼び出されるのだろうか?私は "in start() "と上記のコードの中で、それがすでに半分を閉じた後に毎回 "OP_BUY "を呼び出すことはありませんようにコードを記述する方法が必要ですか?
呼び出されるvoidは、start()の中から呼び出される関数に 過ぎません ... ... それは、コードが直接start()の中にあるのと同じことです。
擬似コードです。
OP_BUYを探す
見つかったら - TPはBEにあるか?
TPがBEになく、Bid >= 第1ターゲットであれば、TPをBEに移動し、注文の半分をクローズする。
TPがBEにある場合、何もしない
はい!!!ありがとう、RaptorUK!
申し訳ありませんが、私は自分が思っているほど愚かではありません ;)- ただ、何か初めてのことをするときに、少し言い直さなければならないことがあるんです。
このようなことは、何ページも前から皆に言われていることだと思いました。
RIGHT!ようやくハーフクローズ、ブレイクイーブンに移行し、同価格でのハーフクローズの連続を止めることができました :D!だから、かなりぴったりなんです!!!
これからやることは、基本的にこれをコピーして、他の出口に貼り付け、いくつかのルールを変更するだけです。ということです。)
もし望むなら、他の人が公平に使えるように、ここにすべてを掲載します - 結局のところ、他の人からの多くの忍耐が、私がコードを書くだけでなく、それを理解することを可能にしました :)
価格が1:1の最初の目標に到達せず、ストップロスがエントリーより大きい場合、どうしたらよいでしょうか?その場合、どのようにルールを作ればいいのでしょうか?
いつブレークイーブンに修正するのですか?
もし目標に到達しなければ、取引はOrderStopLoss()で終了します。
いつブレークイーブンに修正するのでしょうか?
ターゲットに達しない場合、取引はOrderStopLoss()でクローズされます。
OrderClose()を使って半分をクローズし、それがtrueを返したら、breakeven voidを呼び出してストップロスをブレークイーブンに移動させるのですか?そうすれば、残りのロットのオープンポジションは継続的にクローズされることはありません。なぜなら、ポジションがブレークイーブンに移動したなら、1:2の固定利食い価格に達するまで、そのポジションのクローズはもうないように書いてあります。
しかし、いくつかの取引は、取引が最初の目標に到達する前に、エントリーと同じかブレークイーブンを超えてしまうので、ハーフクローズは発生しません...
また、ハーフオフエグジットとブレイクイーブンへの移行が完璧に機能するトレードもありますが、それが機能するはずのトレードが何もしないのです?これはデータの不備とstrategy testerの 欠陥によるものなのでしょうか、それとも私のコードに矛盾があるのでしょうか?
あと、OrderModify1がまだ出ますね、クソイラつく...。
注文をクローズした後、SLを修正して収支を合わせるために、どのように注文を特定するのですか?あなたは、元のチケット番号を使用することができないことを知っていますね?注文をパートクローズすると、元のチケットナンバーはクローズされます。残りの部分には新しいチケット番号が与えられます。それを識別する一つの方法は、注文を閉じる前に OrderOpenTime() を取得することです。注文をパートクローズした後、残りのパートは新しいチケット番号を取得しますが、OrderOpenTime()は以前と同じになります。
また、その OrderOpenTime() を使用して、それを識別し、何度もパートクローズされるのを防ぐことができます。
あるいは、パートクローズする前にそれを変更することもできます。あなたの注文の残りの部分は、変更されたSLまたはTPを保持します。
以下はそのテストです。0.09でオープン パートクローズ 0.07 0.02を残す
チケット番号が変わっても、オープン時間が 変わらないことに注意してください。
23:42:48 2013.08.01 11:28 SDCMegaTrend EURUSD,M1: open #14 buy 0.09 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 ok
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1: close #14 buy 0.07 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 at price 1.3253
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1:アラート: チケット 14 オーダーオープン時間前にパートクローズ。1375356521
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1:アラート: チケット15 OrderOpenTime: 1375356521
23:42:48 2013.08.01 12:45 SDCMegaTrend EURUSD,M1: クローズ #15 buy 0.02 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 at price 1.3242
注文をクローズした後、SLを修正して収支を合わせるために、どのように注文を特定するのですか?あなたは、元のチケット番号を使用することができないことを知っていますね?注文をパートクローズすると、元のチケットナンバーはクローズされます。残りの部分には新しいチケット番号が与えられます。それを識別する一つの方法は、注文を閉じる前に OrderOpenTime() を取得することです。注文をパートクローズした後、残りのパートは新しいチケット番号を取得しますが、OrderOpenTime()は以前と同じになります。
また、その OrderOpenTime() を使用して、それを識別し、何度もパートクローズされるのを防ぐことができます。
あるいは、パートクローズする前にそれを変更することもできます。あなたの注文の残りの部分は、変更されたSLまたはTPを保持します。
以下はそのテストです。0.09でオープン パートクローズ 0.07 0.02を残す
チケット番号が変わっても、オープン時間が変わらないことに注意してください。
23:42:48 2013.08.01 11:28 SDCMegaTrend EURUSD,M1: open #14 buy 0.09 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 ok
23:42:48 2013.08.01.01 12:26 SDCMegaTrend EURUSD,M1: close #14 buy 0.07 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 at price 1.3253
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1.M1: close #14 buy 0.07 EURUSD at 1.3240 sl: 1.3137 tp: 1.3733 ok 23:42:49 2012.08.02 12:26 SDCMegaTrend EURUSD,M1アラート:チケット14 OrderOpenTime before part close:1375356521
23:42:48 2013.08.01 12:26 SDCMegaTrend EURUSD,M1:Alert: Ticket 15 OrderOpenTime: 1375356521
23:42:48 2013.08.01 12:45 SDCMegaTrend EURUSD,M1: close #15 buy 0.02 EURUSD at 1.3240 sl: 1.3037 tp: 1.3737 at price 1.3242.
ああ - すごい、ありがとうございます。OrderOpenTime()のことをすっかり忘れていました。ヒントをありがとうございます。前の投稿に続いて、今はかなりスムーズに動作させることができました。よりスムーズに動作するようになったようです。 唯一の問題は、
ストップロスが OrderEntry()よりも≧大きい取引がある場合、(ロングについて話していると仮定して)半分を閉じるための主な基準が満たされていないので、それは注文の半分を閉じないということです。
ここにあるコードは、半分のロットのクローズを開始し、同じ価格で半分の連続したクローズを停止するものです。
どのようにOrderOpenTime()関数を組み込めば、すべての取引が1:1で半分のロットを閉じ、ストップが≧OrderOpen()であれば見逃すことなく、より良いコントロールができるのでしょうか?
すべての注文がパートクローズされていることを確認する方法はいくつかありますが、私のお気に入りの方法は、パートクローズするときにTPを1ピップずつ変更することです。
例えば、私は100ピップのTPが必要なので、99ピップのTPで注文を出します。テイクプロフィットに 到達する前に、私の注文は40ピップでパートクローズされることが分かっています。そうなったとき、私はTPを100pipsに修正します。従って、利益≧40pipsでTP<100pipsの注文はすべて一部クローズされる必要があります。TPが99pips以上の注文は、すでに一部クローズされています。このようにすれば、SLが何であろうと違いはありません。ただ、計算をする前に、すべての注文の価格の倍数を正規化することを確認してください。