ご訪問ありがとうございます。
ひろしです。
前回
こんなコメントを頂きました。
ひろし:「えっ? ブレークイーブンライン?」
私はブレークイーブンラインって知りませんでした。
本家のセールスページを見ると。。
以下は「プロコン改」のセールスページ
なるほど。保有ポジションの損益分岐点
ってことですね。
やることは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にすることで設定ファイルに
書き込まれるため次回から設定する必要がなくなります。
最後までご覧いただきありがとうございます。
つぎはこちら
コメント
hiroshi様
まさかこんなに早くアップデートしていただけるとは思いませんでしたw
早速使いましたが、おかげさまで視覚的にポジションの状態が把握できるようになりました。
感謝の気持ちでいっぱいです!ありがとうございました!
これからも期待しております!!
ありがとうございます。
proコン もどきに付いての質問
テンプレートで呼び起こした際に「proコン もどき」の画面だけが表示されてて認識されていない
状況に付いては、どのように対処したよいでしょうか。
再度、入れると「proコン もどき」の画面が2つになり、1つは認識されてて最初のものは画面だけが
残っていて消えないし消せません。
対処方法について、ご教授ください。よろしくお願いします。
mak fullさんコメントありがとうございます。
私も同様の現象がありました。
回避策は、その通貨ペアのチャートを閉じて
再度、表示させたと思います。
再現できたら、またお伝えします。