プログラミング開発の覚書として残していきます。
個人的な内容ですので、まとめてません。あしからず。
内容
エントリーリスクを率で制限する部分のプログラム
資産のN%のリスクのロット数を計算する |
【引数】 IN OUT 引数名 説明 【戻値】ロット数
計算した結果、最小ロット数未満になる場合、-1を返す |
aFunds 資金 余剰証拠金 AccountFreeMargin() 口座残高 AccountBalance()
aSymbol 通貨ペア aStopLossPips 損切り値(pips) aRiskPercent リスク率(%)
double calcLotSizeRiskPercent(double aFunds, string aSymbol, double aStopLossPips, double aRiskPercent)
{
// 取引対象の通貨を1ロット売買した時の1ポイント(pipsではない!)当たりの変動額
double tickValue = MarketInfo(aSymbol, MODE_TICKVALUE);
// tickValueは最小価格単位で計算されるため、3/5桁業者の場合、10倍しないと1pipsにならない
if(MarketInfo(aSymbol, MODE_DIGITS) == 3 || MarketInfo(aSymbol, MODE_DIGITS) == 5) {
}
double riskAmount = aFunds * (aRiskPercent / 100.0);
tickValue *= 10.0;
lotSize = riskAmount / (aStopLossPips * tickValue); //double
double lotStep = MarketInfo(aSymbol, MODE_LOTSTEP);
// ロットステップ単位未満は切り捨て
// 0.123⇒0.12(lotStep=0.01の場合)
// 0.123⇒0.1 (lotStep=0.1の場合)
lotSize = MathFloor(lotSize / lotStep) * lotStep;
// 証拠金ベースの制限
double margin = MarketInfo(aSymbol, MODE_MARGINREQUIRED);
if(margin > 0.0) {
double accountMax = aFunds / margin;
accountMax = MathFloor(accountMax / lotStep) * lotStep;
if(lotSize > accountMax) {
lotSize = accountMax;
}
}
// 最大ロット数、最小ロット数対応
double minLots = MarketInfo(aSymbol, MODE_MINLOT);
double maxLots = MarketInfo(aSymbol, MODE_MAXLOT);
if(lotSize < minLots) {
// 仕掛けようとするロット数が最小単位に満たない場合、
// そのまま仕掛けると過剰リスクになるため、エラーに
lotSize = -1.0;
} else if(lotSize > maxLots) {
lotSize = maxLots;
}
ライン反発エントリー処理の動き
SR_Lineテキストボックスに反発ラインの価格値を設定して、Rv_Buy又はRV_sell ボタンを押すと、
エントリーライン、利確ライン、損切りラインが表示される。
エントリー(発注)後は、エントリー価格から6pipsの値幅で損切りを設定、22pipsの幅で利確ラインが設定される。
//リバースブレイク買いボタン処理
if(sparam == "Rv_Buy")
{
if(ObjectGetInteger(0, sparam, OBJPROP_STATE) == true)
{
Alert("リバースブブレイク買いボタンが押されました");
ObjectSetInteger(0, sparam, OBJPROP_STATE, 0); //ボタンを押されていない状態に戻す
ChartRedraw();
}
//トレード手法のタイプ設定
Original_Type = Rv_Buy;
//ライン作成処理
// line_create();
//ターゲット価格を設定していない(値が0)の場合
if(RN_SR <= 0)
{
//リバーサルブレークライン(ライトグリーンの破線)を現在の価格より3ピップス下に作成
ObjectCreate("Horizontal Line LineforBreak_EA", OBJ_HLINE, 0, Time[0], Close[0] - 3 * PIP);
//リミットライン(青の実線)を現在の高値より20ピップス上に作成
ObjectCreate("Horizontal Line lmLine", OBJ_HLINE, 0, Time[0], High[0] + 20 * PIP);
//ストップライン(赤の実線)を現在の安値より5ピップス下に作成
//ポジションがない(0)の場合に作成
if(pos == 0)
{
//ストップライン(赤の実線)を現在の安値より5ピップス下に作成
ObjectCreate("Horizontal Line slLine", OBJ_HLINE, 0, Time[0], Low[0] - 5 * PIP);
}
}
else
{
//リバーサルブレークライン(ライトグリーンの破線)を設定 の価格より設定ピップス上に作成
ObjectCreate("Horizontal Line LineforBreak_EA", OBJ_HLINE, 0, Time[0], RN_SR + tolerance * PIP);
//リミットライン(青の実線)を現在の高値より22ピップス上に作成
ObjectCreate("Horizontal Line lmLine", OBJ_HLINE, 0, Time[0], RN_SR + 22 * PIP);
//ストップライン(赤の実線)を現在の安値より6ピップス下に作成
//ポジションがない(0)の場合に作成
if(pos == 0)
{
ObjectCreate("Horizontal Line slLine", OBJ_HLINE, 0, Time[0], RN_SR - 6 * PIP);
}
}
//ナンピンエントリー可にする為、前のフラッグを初期化
previousFlag = 0;
}