前回
429 Too Many Requests
さて今回は、ブレークイーブンラインに挑戦です。
そもそも、そんなに難しいことは
していないです。
1 |
ObjectDelete( m_Line_name); |
が、コンパイルエラー
チャートIDがいるらしい
1 |
ObjectDelete(CHARTID, m_Line_name); |
OBJ_HLINE
を使うと水平線が描けるらしいが、
調べるのがメンドイので
既存のロジックのままにする。
を思ったら使っていた^^
また、
Close[10] // 1番目の価格のアンカーポイント
でエラー
1 |
ObjectSet(m_Line_name, OBJPROP_PRICE1, dprice); |
もエラー
これらをコメントアウトし
とりあえず、コンパイルを通しました。
//ブレークイーブンライン用構造体
変更なし
1 2 3 4 5 6 7 8 |
//ブレークイーブンライン用構造体 struct BELtype { double dOrderPricelots; //注文価格 * ロット数 double dlots; //注文ロット数 }; BELtype buy = {0}; BELtype sell = {0}; |
//ブレークイーブンライン用に足し込む
注文価格、ロット数、注文タイプを置き換えればOK
MQL4 | MQL5 | |
注文価格 | OrderOpenPrice() | PositionGetDouble(POSITION_PRICE_OPEN) |
ロット数 | OrderLots() | PositionGetDouble(POSITION_VOLUME) |
注文タイプ | OrderType() | PositionGetInteger(POSITION_TYPE) |
注文タイプ 買いの定義 | OP_BUY | POSITION_TYPE_BUY |
MQL4
1 2 3 4 5 6 7 8 9 10 11 12 |
//ブレークイーブンライン用に、足し込んでいく // Print("OrderLots =", OrderLots()); if(ot == OP_BUY) { buy.dOrderPricelots += OrderOpenPrice() * OrderLots(); //注文価格*ロット数 buy.dlots += OrderLots(); //ロット数 } else { sell.dOrderPricelots += OrderOpenPrice() * OrderLots(); //注文価格*ロット数 sell.dlots += OrderLots(); //ロット数 } |
MQL5
1 2 3 4 5 6 7 8 9 10 11 |
//ブレークイーブンライン用に足し込む if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY) { buy.dOrderPricelots += PositionGetDouble(POSITION_PRICE_OPEN) * PositionGetDouble(POSITION_VOLUME); buy.dlots += PositionGetDouble(POSITION_VOLUME); //ロット数 } else { sell.dOrderPricelots += PositionGetDouble(POSITION_PRICE_OPEN) * PositionGetDouble(POSITION_VOLUME); sell.dlots += PositionGetDouble(POSITION_VOLUME); //ロット数 } |
共通
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
//ブレークイーブンライン double dtotallots = buy.dlots + sell.dlots; //トータル購入ロット数 if(dtotallots != 0) //購入ロットあれば { double dspPrice; //ブレークイーブンライン if(buy.dOrderPricelots > sell.dOrderPricelots) { dspPrice = (buy.dOrderPricelots - sell.dOrderPricelots) / dtotallots; } else { dspPrice = (sell.dOrderPricelots - buy.dOrderPricelots) / dtotallots; } DrawBreakOrderLine(dspPrice); } else { ObjectDelete(CHARTID, m_Line_name); } |
水平線の描画
MQL4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
//+------------------------------------------------------------------+ //ブレークイーブンラインを描画する //+------------------------------------------------------------------+ void DrawBreakOrderLine(double dprice) { //ブレークイーブンライン非表示のときは、何もしない if(input_DspBEL == false) return; //ブレークイーブンラインを再描画する if(ObjectSet(m_Line_name, OBJPROP_PRICE1, dprice) == false) { //無いのでブレークイーブンラインを作成する int chart_id = 0; ObjectCreate(chart_id, m_Line_name, // オブジェクト作成 OBJ_HLINE, // オブジェクトタイプ 0, // サブウインドウ番号 0, // 1番目の時間のアンカーポイント Close[10] // 1番目の価格のアンカーポイント ); // Print("ColorBEL = ", input_ColorBEL); ObjectSetInteger(chart_id, m_Line_name, OBJPROP_COLOR, input_ColorBEL); // ラインの色設定 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_WIDTH, input_WidthBEL); // ラインの幅設定 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_STYLE, STYLE_SOLID); // ラインのスタイル設定 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_BACK, false); // オブジェクトの背景表示設定 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_SELECTABLE, true); // オブジェクトの選択可否設定 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_SELECTED, false); // オブジェクトの選択状態 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_HIDDEN, true); // オブジェクトリスト表示設定 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_ZORDER, 0); // オブジェクトのチャートクリックイベント優先順位 ObjectSet(m_Line_name, OBJPROP_PRICE1, dprice); } //★あっても色と幅は設定する(設定後にのみ設定するように変更すること) ObjectSetInteger(0, m_Line_name, OBJPROP_COLOR, input_ColorBEL); // ラインの色設定 ObjectSetInteger(0, m_Line_name, OBJPROP_WIDTH, input_WidthBEL); // ラインの幅設定 } |
MQL5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
//ブレークイーブンラインを描画する //+------------------------------------------------------------------+ void DrawBreakOrderLine(double dprice) { //ブレークイーブンライン非表示のときは、何もしない if(input_DspBEL == false) return; Print(__FUNCTION__, "dprice=", dprice); //ブレークイーブンラインを再描画する // if(ObjectSet(m_Line_name, OBJPROP_PRICE1, dprice) == false) // { //無いのでブレークイーブンラインを作成する int chart_id = 0; ObjectCreate(chart_id, m_Line_name, // オブジェクト作成 OBJ_HLINE, // オブジェクトタイプ 0, // サブウインドウ番号 0, // 1番目の時間のアンカーポイント dprice// Close[10] // 1番目の価格のアンカーポイント ); // Print("ColorBEL = ", input_ColorBEL); ObjectSetInteger(chart_id, m_Line_name, OBJPROP_COLOR, input_ColorBEL); // ラインの色設定 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_WIDTH, input_WidthBEL); // ラインの幅設定 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_STYLE, STYLE_SOLID); // ラインのスタイル設定 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_BACK, false); // オブジェクトの背景表示設定 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_SELECTABLE, true); // オブジェクトの選択可否設定 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_SELECTED, false); // オブジェクトの選択状態 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_HIDDEN, true); // オブジェクトリスト表示設定 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_ZORDER, 0); // オブジェクトのチャートクリックイベント優先順位 // ObjectSet(m_Line_name, OBJPROP_PRICE1, dprice); // } //★あっても色と幅は設定する(設定後にのみ設定するように変更すること) ObjectSetInteger(0, m_Line_name, OBJPROP_COLOR, input_ColorBEL); // ラインの色設定 ObjectSetInteger(0, m_Line_name, OBJPROP_WIDTH, input_WidthBEL); // ラインの幅設定 } |
あれ? できちゃった!
毎回Create()するのはどうかとか、
もう少し見直す必要はありますが、
とりあえず動きました。
———-2021/05/12 追記——————–
ソース共通化に当たり
1 |
ObjectSet(m_Line_name, OBJPROP_PRICE1, dprice); |
が抜けてしまい、MT4で動作しなくなっていました。
MT4の場合のみ
1 |
ObjectSet(m_Line_name, OBJPROP_PRICE1, dprice); |
を通すよう修正しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
//+------------------------------------------------------------------+ //ブレークイーブンラインを描画する //+------------------------------------------------------------------+ void DrawBreakOrderLine(double dprice) { //ブレークイーブンライン非表示のときは、何もしない if(input_DspBEL == false) return; // Print(__FUNCTION__, "dprice=", dprice); int chart_id = 0; ObjectCreate(chart_id, m_Line_name, // オブジェクト作成 OBJ_HLINE, // オブジェクトタイプ 0, // サブウインドウ番号 0, // 1番目の時間のアンカーポイント dprice // 1番目の価格のアンカーポイント ); ObjectSetInteger(chart_id, m_Line_name, OBJPROP_COLOR, input_ColorBEL); // ラインの色設定 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_WIDTH, input_WidthBEL); // ラインの幅設定 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_STYLE, STYLE_SOLID); // ラインのスタイル設定 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_BACK, false); // オブジェクトの背景表示設定 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_SELECTABLE, true); // オブジェクトの選択可否設定 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_SELECTED, false); // オブジェクトの選択状態 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_HIDDEN, true); // オブジェクトリスト表示設定 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_ZORDER, 0); // オブジェクトのチャートクリックイベント優先順位 #ifndef __MQL5__ ObjectSet(m_Line_name, OBJPROP_PRICE1, dprice); #endif |
次は→「TrimPips MT5対応 注文時のSL,TP機能(MQL4からMQL5へ)」
TrimPips MT5対応 ダウンロードはこちらから→「TrimPips MT5対応 お試し版ダウンロード申請」