ここでは、Multi Lot ScalperというEAのコードを解読していきます。前回記事【Multi_Lot_Scalperの解読2】の続きからです。
ダウンロード元はこちら↓
https://www.mql5.com/en/code/9330
EAのコードを解読(続き)
では、早速続きを見ていきましょう!
トレーリングストップ
続きのコードがこちら。
for(cnt = OrdersTotal(); cnt >= 0; cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol() == Symbol()) { if(OrderType() == OP_SELL) if(TrailingStop > 0) if(OrderOpenPrice() - Ask >= (TrailingStop + Pips)*Point) if(OrderStopLoss() > (Ask + Point*TrailingStop)) { OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point*TrailingStop, OrderClosePrice() - TakeProfit*Point - TrailingStop*Point, 800, Purple); return(0); } if(OrderType() == OP_BUY) if(TrailingStop > 0) if(Bid - OrderOpenPrice() >= (TrailingStop + Pips)*Point) if(OrderStopLoss() < (Bid - Point*TrailingStop)) { OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point*TrailingStop, OrderClosePrice() + TakeProfit*Point + TrailingStop*Point, 800, Yellow); return(0); } } }
なんだかややこしいのですね。少し変形したコードがこちら。
if (TrailingStop > 0) { for(cnt = OrdersTotal(); cnt >= 0; cnt--) { OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); if(OrderSymbol() != Symbol()) continue; if(OrderType() == OP_SELL) if(Ask <= OrderOpenPrice() - (TrailingStop + Pips) * Point) if(OrderStopLoss() > Ask + TrailingStop * Point) { OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TrailingStop*Point, OrderClosePrice() - TakeProfit*Point - TrailingStop*Point, 800, Purple); return(0); } if(OrderType() == OP_BUY) if(Bid >= OrderOpenPrice() + (TrailingStop + Pips) * Point) if(OrderStopLoss() < Bid - TrailingStop * Point) { OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TrailingStop*Point, OrderClosePrice() + TakeProfit*Point + TrailingStop*Point, 800, Yellow); return(0); } } }
もし TrailingStop が0より大きい場合 取引タブの下からポジションを選択して、通貨ペアが一致したポジションなら 売りポジションの場合、 Ask が エントリー価格 - (TrailingStop + Pips)ポイント 以下で 現在SL が Ask + TrailingStopポイント より大きい場合、 SLを Ask + TrailingStopポイント に TPを 決済価格(Ask) - TakeProfitポイント - TrailingStopポイント に変更 start()関数終了。 買いポジションの場合、 Bid が エントリー価格 + (TrailingStop + Pips)ポイント 以上で 現在SL が Bid - TrailingStopポイント より小さい場合、 SLを Bid - TrailingStopポイント に TPを 決済価格(Bid) + TakeProfitポイント + TrailingStopポイント に変更 start()関数終了。
ざっくり言うと、パラメーター「Pips」ポイント利益方向から始まるTrailingStopポイント幅のトレーリングです。それと同時にTPを現在価格から(TakeProfit+TrailingStop)ポイント離れた価格に再設定しています。
このコードのままだと、売りポジションのSL設定なし(OrderStopLoss() == 0)のとき、トレーリングが発動しません。
if(OrderStopLoss() > Ask + TrailingStop * Point)
↓
if(OrderStopLoss() == 0 || OrderStopLoss() > Ask + TrailingStop * Point)
というように修正が必要です。
あと実数の比較の際には、できれば価格表示小数桁数で丸めて比較した方が良いです。
また、OrderModify()関数の有効期限には、日時を指定するようにしますが、予約注文の為のパラメーターで約定済みのポジションには指定できません。
他にも気になる点がありますが、まだまだ先がありますので今日はこの辺で。
こんばんは。
ちょっとお聞きしたいのですが、記憶用の変数に注文約定時の足でのある指標の数値を記憶させるにはどのようにすればいいのでしょうか?
例えばBBバンドのlowerを記憶させたい場合、単にstart関数内に
double kioku = iBands(NULL,0,21,2,0,0,MODE_lower,0)
と書くと足が変わる毎に数値も変わっちゃいますよね。
注文が約定した時の指標の値を記憶させたいです。よろしくお願いします。
こんばんは。
早速このEAを取り上げていただきありがとうございます。ただいま仕事が忙しく殆ど手付かづですが後ほど、このブログを参考に解析したいと思います。もし宜しければ、その際に生じた疑問点などにお答えてしていただければ幸いです。
>sauceさん
おはようございます。
注文が約定した時の指標の値を記憶させる場合は、パラメータの次辺りに
double kioku;
と記憶用の変数を宣言しますよね!
そして、start関数内に
int ticket;
というように注文番号を代入する整数変数を一つ宣言します。
そして
ticket=Ordersend(・・・);
if(ticket>0) kioku = iBands(・・・);
というようにオーダーを出した後、注文が約定した(ticket>0)場合のみ代入するといった書き方でいけると思います。
また、何かありましたら教えてくださいね!
>naoさん
おはようございます。
そうですね。このプログラムは、あれ?ってゆうところが何ヶ所かあったので、疑問点などなんでも聞いてくださいね!
こんばんは。
早速のご回答ありがとうございます。
なるほどOrdersend関数は注文番号を返すんですね、注文するだけだと思ってました。
いつも参考にさせていただいております。
ご質問なのですが、HPアップされている
移動平均の売買を見ながら試行錯誤しているのですがどうしてもうまくいかないのでよろしければ少しご教授していただきたいのですが・・・よろしくお願いします。
初心者ですのであまり理解出来ておりません。
1.移動平均を上(下)に超えた直後に買い(売り)ポジションを取る。
2.買い(売り)ポジションがある場合は
ポジションを取らない。要はポジションは常に1個
3.移動平均より上(下)でポジションをとった場合は連続でポジションを同じ方向にはとらない。要は買い→売り→買い→売り・・・の法則でのみ
4.買いのポジションで決済されずに売りのポジションを持つ場合は買いを決済して売り
のポジションをもつ
長文で申し訳ないのですがどうしても何回もポジションをもったり、グラフでみると移動平均を抜けた箇所から離れた箇所からポジションを持っています。
お時間があればご教授頂けると助かります。
>sauceさん
こんにちわ。
参考になりましたでしょうか?
また分からないこととかありましたら、何でもきいてくださいね!
>xyz__さん
こんにちわ。
新しく、記事にしましたので、参考にしてください。また、分からない箇所とかありましたら、聞いてくださいね!