ご訪問ありがとうございます。
ひろしです。
前回
こんなコメントを頂きました。
ひろし:「えっ? ブレークイーブンライン?」
私はブレークイーブンラインって知りませんでした。
本家のセールスページを見ると。。
以下は「プロコン改」のセールスページ
なるほど。保有ポジションの損益分岐点
ってことですね。
やることは3つ
- チャート上にラインを引く
- ブレークイーブンラインの値(表示位置)を取得する
- ブレークイーブンラインの表示/非表示を設定可能にする
なんとなく簡単にできそうです。
チャート上にラインを引く
ライン自体を引くのは簡単です。
ObjectCreate()してObjectInteger()すれば
いいだけのようです。
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 |
void DrawBreakOrderLine(double dprice) { if(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 = ", ColorBEL); ObjectSetInteger(chart_id, m_Line_name, OBJPROP_COLOR, ColorBEL); // ラインの色設定 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_STYLE, STYLE_SOLID); // ラインのスタイル設定 ObjectSetInteger(chart_id, m_Line_name, OBJPROP_WIDTH, WidthBEL); // ラインの幅設定 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); } |
これは、すぐできました。
ブレークイーブンラインの位置
問題は、どこに線を引くかです。
単純に、エントリー×ロット数 を足し込み
総ロット数で割ればいいのでしょうか?
そうした場合、両建てにするとどうなるのか?????
結局、両建ての場合の計算方法は、
よくわからなず仕舞いです。
とりあえず、計算式は
(エントリー × ロット数 × ポジション数) ÷ 総ロット数
にしました。
とりあえず、両建ての場合は、 多い方から引き算し
総ロット数で割ることにしました。
1 2 3 4 5 6 7 8 |
売りの総数 (エントリー × ロット数 × ポジション数) 買いの総数 (エントリー × ロット数 × ポジション数) とし ■売りの総数が多い ( 売りの総数 - 買いの総数 ) ÷ 総ロット数 ■買いの総数が多い ( 買いの総数 - 売りの総数 ) ÷ 総ロット数 |
両建ての正しい計算方法がわかる方は
教えてください。
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 |
void OnTick() { //ブレークイーブンライン用構造体 struct BELtype { double dOrderPricelots; //注文価格 * ロット数 double dlots; //注文ロット数 }; BELtype buy = {0}; BELtype sell = {0}; //全オーダーのループ dtemppips *= DigitsValue ; if(OrderSymbol() == m_symbol) //現在のチャートと同じ通貨の場合 { bcurrent = true; DrawlbelAddColr((string)OrderTicket(), dtemppips); d_currentpips += dtemppips; //足し込む //ブレークイーブンライン用に、足し込んでいく // Print("OrderLots =", OrderLots()); if(ot == OP_BUY) { buy.dOrderPricelots += OrderOpenPrice() * OrderLots(); //注文価格*ロット数 buy.dlots += OrderLots(); //ロット数 } else { sell.dOrderPricelots += OrderOpenPrice() * OrderLots(); //注文価格*ロット数 sell.dlots += OrderLots(); //ロット数 } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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(m_Line_name); } |
こんな感じにしました。
ブレークイーブンラインの設定
これは、設定の可否及び線の色と太さを
入力可能にします。
1 2 3 |
input bool input_DspBEL = true; //ブレークイーブンラインの表示 input color input_ColorBEL = clrYellow; //ブレークイーブンラインの色 input int input_WidthBEL = 2; //ブレークイーブンラインの幅 |
これでとりあえず、完成です。
くっきり鮮やかに「ブレークイーブンライン」が
表示されるようになりました。
さて、ココまではよかったのですが、
面倒くさいのは、設定をファイル出力し
起動時に設定をファイルから読み込むことです。
ここにかなり時間を割きました。
初期処理でファイル読み込み
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 |
//ファイル読み込み int handle = FileOpen(Str_IniFileName, FILE_CSV, '='); if(handle != INVALID_HANDLE) { while(!FileIsEnding(handle)) //ファイルの終わりまで繰り返す { //ファイルからデータの読み込み string name = FileReadString(handle); if(name == "Font_TotalPips") Font_TotalPips = FileReadString(handle); if(name == "Font_DspPips") Font_DspPips = FileReadString(handle); if(name == "Dialog_FontSize") Dialog_FontSize = (int)FileReadNumber(handle);; if(name == "DspPips_FontSize") DspPips_FontSize = (int)FileReadNumber(handle);; if(name == "DspBEL") //ブレークイーブンラインの表示 DspBEL = FileReadBool(handle); if(name == "ColorBEL") //ブレークイーブンラインの色 { ColorBEL = StringToColor(FileReadString(handle)); Print("ファイル読み込みColorBEL = ", ColorBEL); } if(name == "WidthBEL")//ブレークイーブンラインの幅 WidthBEL = (int)FileReadNumber(handle); } FileClose(handle); //ファイルクローズ } else { Print("読み込み失敗Dialog_FontSize = ", Dialog_FontSize); SetInputValue(); } } |
終了時にファイル出力
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//ファイル書き込み int handle = FileOpen(Str_IniFileName, FILE_WRITE | FILE_TXT, '='); if(handle != INVALID_HANDLE) { //ファイルへデータの書き込み FileWrite(handle, "Font_TotalPips", Font_TotalPips); FileWrite(handle, "Font_DspPips", Font_DspPips); FileWrite(handle, "Dialog_FontSize", Dialog_FontSize); FileWrite(handle, "DspPips_FontSize", DspPips_FontSize); FileWrite(handle, "DspBEL", DspBEL); FileWrite(handle, "ColorBEL", ColorBEL); FileWrite(handle, "WidthBEL", WidthBEL); FileClose(handle); //ファイルクローズ } |
問題は、ファイル読み込みが
設定ダイアログのあとに行われることです。
苦肉の策として、設定ダイアログに
「この画面の設定で動作する」っていう
項目を追加しました。
「この画面の設定で動作する」のチェックの有無で、
ファイルの設定を優先するか
設定画面の設定を優先するかを決めます。
1 2 3 4 5 6 7 8 9 10 11 |
//+------------------------------------------------------------------+ //|設定ダイアログで入力された値を採用する | //+------------------------------------------------------------------+ void SetInputValue(void) { Dialog_FontSize = input_Dialog_FontSize; //ダイアログ フォントサイズ DspPips_FontSize = input_DspPips_FontSize; //チャート画面 PIPS表示フォントサイズ DspBEL = input_DspBEL; //ブレークイーブンラインの表示 ColorBEL = input_ColorBEL; //ブレークイーブンラインの色 WidthBEL = input_WidthBEL; //ブレークイーブンラインの幅 } |
と、文字を読んでもよくわからないと思いますので
パラメータの入力
「この画面の設定で動作する」が[false]の場合、
設定ファイル(procon.ini)の値を優先します。
procon.ini
このファイルを直接変更するのもありです。
なので、プルダウンにないフォントも設定可能です。
「この画面の設定で動作する」が[true]の場合、
この画面(「パラメータの入力」画面)の設定が反映されます。
なので、「パラメータの入力」画面の設定を有効にしたい場合は、
「この画面の設定で動作する」を[true]にする必要があります。
ちょっと、めんどうくさいのですが、trueにすることで設定ファイルに
書き込まれるため次回から設定する必要がなくなります。
最後までご覧いただきありがとうございます。
つぎはこちら