プラス、マイナス決済と
ショート、ロング決済を追加してほしいという
依頼がありました。
簡単にできそうなので挑戦。
しかしながら問題は、表示とボタンを追加すると
UIが長くなってしまう。
なので、ボタンのキャプションに
表示させることにしました。
やること
- ボタンの追加
- pips足し込み処理
- クローズ処理
ボタンの追加
単純作業です。
とはいえ、ボタンの位置が意外とずれる。
ボタンの定義と作成
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
CButton m_btnPlusExit; //プラスを決済 CButton m_btnMinusExit; //マイナスを決済 CButton m_btnShortExit; //売りを決済 CButton m_btnLongExit; //買いを決済か bool CreateBtnPlusExit(); //プラスを決済 bool CreateBtnMinusExit(); //マイナスを決済 bool CreateBtnShortExit(); //売りを決済 bool CreateBtnLongExit(); //買いを決済 const string EXIT_PLUS = "プラス決済"; const string EXIT_MINUS = "マイナス決済"; const string EXIT_SHORT = "Short決済"; const string EXIT_LONG = "Long決済"; |
クローズ関数の定義
1 2 3 4 |
void OnClickPlusExit(); void OnClickMinusExit(); //マイナスを決済 void OnClickShortExit(); //売りを決済 void OnClickLongExit(); //買いを決済 |
表示位置
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 |
m_pips_Totall_y = 10; //Total pipsの表示位置 m_lblHeight = 30; //ラベルの高さ m_pips_Current_y = m_pips_Totall_y + m_lblHeight; //Current pipsの表示位置 m_TradeBtnheight = m_pips_Current_y ; //ボタンの表示開始位置 m_BtnHeight = 30; //一つのボタンの高さ m_fontsize = 13; //ラベルフォントサイズ m_BtnVisible_x = 150; //ボタン非表示のX座標 #ifdef __MQL5__ berasepips = 0; //PIPS整理中フラグ #endif // m_pips_Exit_y = m_TradeBtnheight + (m_BtnHeight * 3); //--------------------------- // 30 Total //--------------------------- // 30 全通貨ペア m_TradeBtnheight //--------------------------- // 30 現通貨ペア m_BtnHeight*1 //--------------------------- // 30 +決済|-決済 m_BtnHeight*2 //--------------------------- // 30 TP決済|SL決済 m_BtnHeight*3 //--------------------------- // 30 PIPS消去|スクショ m_BtnHeight*4 //--------------------------- |
こんな感じで各ボタンを生成 X 4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//+------------------------------------------------------------------+ //|プラスを決済ボタンの生成 CButton m_btnPlusExit; //プラスを決済 | //+------------------------------------------------------------------+ bool CPanelDialog::CreateBtnPlusExit(void) { int x1 = 0; int x2 = ClientAreaWidth() / 2; int y1 = m_TradeBtnheight + m_BtnHeight * 2 ; int y2 = y1 + m_BtnHeight; if(!m_btnPlusExit.Create(m_chart_id, m_name + "Plus Exit", m_subwin, x1, y1, x2, y2)) return false; if(!m_btnPlusExit.Font("MS UI Gothic")) return false; if(!m_btnPlusExit.FontSize(m_fontsize)) return false; if(!m_btnPlusExit.Text("+決済")) return false; if(!Add(m_btnPlusExit)) return false; return true; } |
クローズの呼び出し X 4
1 2 3 4 5 6 7 8 9 |
//+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CPanelDialog::OnClickPlusExit(void) { ExitCurrency.ExitByProfit(true); } |
pips足し込み処理
ベタに足し込む処理
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 |
//ポジション分のループ for(int i = 0; i < nPositonCount ; i++) { ***************************** if(dtemppips > 0) { d_PlusPips += dtemppips; //プラスポジション } else { d_MinusPips += dtemppips; //マイナスポジション } if(bOrderType == #ifdef __MQL5__ POSITION_TYPE_BUY #else OP_BUY #endif ) { d_LongPips += dtemppips; //ロングポジション } else { d_ShortPips += dtemppips; //ショートポジション } ********************** } |
表示ように整形し表示
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 |
string strtemp; //表示用に値を四捨五入する strPlusPips = DoubleToString(d_PlusPips, 1); //プラスポジション strMinusPips = DoubleToString(d_MinusPips, 1); //マイナスポジション //ボタンのキャプションをセットする AppWindow.m_btnPlusExit.Text(Str_Plus + strPlusPips + STR_PIPS); AppWindow.m_btnMinusExit.Text(Str_Minus + strMinusPips + STR_PIPS); if(d_ShortPips == 0) { strtemp = EXIT_SHORT; } else { strtemp = STR_SHRT + DoubleToString(d_ShortPips, 1) + STR_PIPS; } AppWindow.m_btnShortExit.Text(strtemp); AppWindow.m_btnShortExit.Color(gColor(d_ShortPips)); if(d_LongPips == 0) { strtemp = EXIT_LONG; } else { strtemp = strLongPips = DoubleToString(d_LongPips, 1); //ロングポジション strtemp = STR_LONG + strLongPips + STR_PIPS; } AppWindow.m_btnLongExit.Text(strtemp); AppWindow.m_btnLongExit.Color(gColor(d_LongPips)); |
-
クローズ処理
MT5版がめんどい
クローズが非同期なので
クローズが完了したかどうかを別にチェックする必要がある
最初は、既存のチケットごとのクローズを呼び出したが
うまく行かないので、「現通貨ペアを決済する 」と同様の
ロジックに
イマイチ感満載だが、 プラス、マイナスクローズ
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 38 39 40 41 42 43 44 45 |
void CExitCurrency::ExitByProfit(bool bprofit) // --- 4 { long lorderno; CTrade ExtTrade; int leftcount = 0; //現通貨の残り個数 Print(__FUNCTION__, "bprofit =", bprofit); for(int s = 0; s < 10; s++) //クローズが失敗したときのループ { leftcount = 0; //現通貨の残り個数 int ncount = PositionsTotal(); Print(s, "回目め 残り回数 -> ", ncount); for(int i = 0; i < ncount; i++) { PositionGetTicket(i); if(((PositionGetDouble(POSITION_PROFIT) > 0) && (bprofit)) || //プラスをクローズの場合 ((PositionGetDouble(POSITION_PROFIT) < 0) && (!bprofit))) //マイナスをクローズの場合 { leftcount++; lorderno = PositionGetInteger(POSITION_TICKET); //チケット番号 Print(__FUNCTION__, "lorderno =", lorderno); if(! ExtTrade.PositionClose(lorderno)) { Print("PositionClose失敗"); } PlaySound("Ok.wav"); Print("ResultRetcode -> ", ExtTrade.ResultRetcode()); Sleep(10); } } if(!leftcount) //該当ポジションがなかったらループを抜ける break; Sleep(250); } } |
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 38 39 40 41 42 43 44 45 46 47 |
//+------------------------------------------------------------------+ //| ショート、ロングクローズ //+------------------------------------------------------------------+ void CExitCurrency::ExitByPosType(int nPosType) // --- 4 { long lorderno; CTrade ExtTrade; int leftcount = 0; //現通貨の残り個数 Print(__FUNCTION__, "nPosType =", nPosType); for(int s = 0; s < 10; s++) { leftcount = 0; //現通貨の残り個数 int ncount = PositionsTotal(); Print(s, "回目め 残り回数 -> ", ncount); for(int i = 0; i < ncount; i++) { PositionGetTicket(i); if(PositionGetInteger(POSITION_TYPE) == nPosType)//ポジションタイプ { leftcount++; lorderno = PositionGetInteger(POSITION_TICKET); //チケット番号 Print(__FUNCTION__, "lorderno =", lorderno); if(! ExtTrade.PositionClose(lorderno)) { Print("PositionClose失敗"); } // PlaySound("Ok.wav"); Print("ResultRetcode -> ", ExtTrade.ResultRetcode()); Sleep(10); } } if(!leftcount) //該当ポジションがなかったらループを抜ける break; Sleep(250); } } |
つぎはこちら
TrimPips機能強化版(MT5対応)ダウンロード
TrimPips機能強化版(MT5対応)がダウンロードできます。
コメント
ショートのスペルが違います
スペルさん
ご指摘ありがとうございます。
確かに、間違っていますね。
いつの間にか直っていました^^