複利リスクパーセントではなく、証拠金の増減に対して自動でLotを増減できるようにしたいのですが、その際のソースコードはどのようなものになるでしょうか?
MAXポジション数の設定は、[1~5]まで選択できるようにします。
ナンピン・マーチンゲールは無しのEAです。(MAXポジション数は5まで設定できますが、それぞれのポジションがナンピンEAのように関連して決済されることはありません。例えば、それぞれのポジションはTP:20pips、SL:100pipsのように決済されます。)
下記は、パラメータで、MAXポジション数を5と設定した時の、複利運用の際の証拠金の額とLotの対応表です。
合計MAXロットが0.05Lot(内訳:0.01Lot×5)→<1ポジ分のロットが0.01Lot>の時の<推奨証拠金は5万円>
合計MAXロットが0.1Lot(内訳:0.02Lot×5)→<1ポジ分のロットが0.02Lot>の時の<推奨証拠金は10万円>→なので、証拠金が10万円に届いたら、次に取るポジションは0.02Lotになるようにプログラミングする。
合計MAXロットが0.15Lot(内訳:0.03Lot×5)→<1ポジ分のロットが0.03Lot>の時の<推奨証拠金は15万円>→なので、証拠金が15万円に届いたら、次に取るポジションは0.03Lotになるようにプログラミングする。
合計MAXロットが0.2Lot(内訳:0.04Lot×5)→<1ポジ分のロットが0.04Lot>の時の<推奨証拠金は20万円>→なので、証拠金が20万円に届いたら、次に取るポジションは0.04Lotになるようにプログラミングする。
合計MAXロットが0.25Lot(内訳:0.05Lot×5)→<1ポジ分のロットが0.05Lot>の時の<推奨証拠金は25万円>→なので、証拠金が25万円に届いたら、次に取るポジションは0.05Lotになるようにプログラミングする。
合計MAXロットが0.3Lot(内訳:0.06Lot×5)→<1ポジ分のロットが0.06Lot>の時の<推奨証拠金は30万円>→なので、証拠金が30万円に届いたら、次に取るポジションは0.06Lotになるようにプログラミングする。
合計MAXロットが0.35Lot(内訳:0.07Lot×5)→<1ポジ分のロットが0.07Lot>の時の<推奨証拠金は35万円>→なので、証拠金が35万円に届いたら、次に取るポジションは0.07Lotになるようにプログラミングする。
合計MAXロットが0.4Lot(内訳:0.08Lot×5)→<1ポジ分のロットが0.08Lot>の時の<推奨証拠金は40万円>→なので、証拠金が40万円に届いたら、次に取るポジションは0.08Lotになるようにプログラミングする。
合計MAXロットが0.45Lot(内訳:0.09Lot×5)→<1ポジ分のロットが0.09Lot>の時の<推奨証拠金は45万円>→なので、証拠金が45万円に届いたら、次に取るポジションは0.09Lotになるようにプログラミングする。
合計MAXロットが0.5Lot(内訳:0.1Lot×5)→<1ポジ分のロットが0.1Lot>の時の<推奨証拠金は50万円>→なので、証拠金が50万円に届いたら、次に取るポジションは0.1Lotになるようにプログラミングする。
合計MAXロットが0.55Lot(内訳:0.11Lot×5)→<1ポジ分のロットが0.11Lot>の時の<推奨証拠金は55万円>→なので、証拠金が55万円に届いたら、次に取るポジションは0.11Lotになるようにプログラミングする。
合計MAXロットが0.6Lot(内訳:0.12Lot×5)→<1ポジ分のロットが0.12Lot>の時の<推奨証拠金は60万円>→なので、証拠金が60万円に届いたら、次に取るポジションは0.12Lotになるようにプログラミングする。
合計MAXロットが0.65Lot(内訳:0.13Lot×5)→<1ポジ分のロットが0.13Lot>の時の<推奨証拠金は65万円>→なので、証拠金が65万円に届いたら、次に取るポジションは0.13Lotになるようにプログラミングする。
合計MAXロットが0.7Lot(内訳:0.14Lot×5)→<1ポジ分のロットが0.14Lot>の時の<推奨証拠金は70万円>→なので、証拠金が70万円に届いたら、次に取るポジションは0.14Lotになるようにプログラミングする。
合計MAXロットが0.75Lot(内訳:0.15Lot×5)→<1ポジ分のロットが0.15Lot>の時の<推奨証拠金は75万円>→なので、証拠金が75万円に届いたら、次に取るポジションは0.15Lotになるようにプログラミングする。
合計MAXロットが0.8Lot(内訳:0.16Lot×5)→<1ポジ分のロットが0.16Lot>の時の<推奨証拠金は80万円>→なので、証拠金が80万円に届いたら、次に取るポジションは0.16Lotになるようにプログラミングする。
合計MAXロットが0.85Lot(内訳:0.17Lot×5)→<1ポジ分のロットが0.17Lot>の時の<推奨証拠金は85万円>→なので、証拠金が85万円に届いたら、次に取るポジションは0.17Lotになるようにプログラミングする。
合計MAXロットが0.9Lot(内訳:0.18Lot×5)→<1ポジ分のロットが0.18Lot>の時の<推奨証拠金は90万円>→なので、証拠金が90万円に届いたら、次に取るポジションは0.18Lotになるようにプログラミングする。
合計MAXロットが0.95Lot(内訳:0.19Lot×5)→<1ポジ分のロットが0.19Lot>の時の<推奨証拠金は95万円>→なので、証拠金が95万円に届いたら、次に取るポジションは0.19Lotになるようにプログラミングする。
合計MAXロットが1Lot(内訳:0.2Lot×5)→<1ポジ分のロットが0.2Lot>の時の<推奨証拠金は100万円>→なので、証拠金が100万円に届いたら、次に取るポジションは0.2Lotになるようにプログラミングする。
便宜上、ここから下は1ポジ分のロットを0.1Lot刻みにします。(ただし、実際はここから↓も、(複利運用設定でも、単利固定ロット設定でも)0.01ロット単位で設定される/できるようにする。)
合計MAXロットが1.5Lot(内訳:0.3Lot×5)→<1ポジ分のロットが0.3Lot>の時の<推奨証拠金は150万円>→なので、証拠金が150万円に届いたら、次に取るポジションは0.3Lotになるようにプログラミングする。
合計MAXロットが2Lot(内訳:0.4Lot×5)→<1ポジ分のロットが0.4Lot>の時の<推奨証拠金は200万円>→なので、証拠金が200万円に届いたら、次に取るポジションは0.4Lotになるようにプログラミングする。
合計MAXロットが2.5Lot(内訳:0.5Lot×5)→<1ポジ分のロットが0.5Lot>の時の<推奨証拠金は250万円>→なので、証拠金が250万円に届いたら、次に取るポジションは0.5Lotになるようにプログラミングする。
合計MAXロットが3Lot(内訳:0.6Lot×5)→<1ポジ分のロットが0.6Lot>の時の<推奨証拠金は300万円>→なので、証拠金が300万円に届いたら、次に取るポジションは0.6Lotになるようにプログラミングする。
合計MAXロットが3.5Lot(内訳:0.7Lot×5)→<1ポジ分のロットが0.7Lot>の時の<推奨証拠金は350万円>→なので、証拠金が350万円に届いたら、次に取るポジションは0.7Lotになるようにプログラミングする。
合計MAXロットが4Lot(内訳:0.8Lot×5)→<1ポジ分のロットが0.8Lot>の時の<推奨証拠金は400万円>→なので、証拠金が400万円に届いたら、次に取るポジションは0.8Lotになるようにプログラミングする。
合計MAXロットが4.5Lot(内訳:0.9Lot×5)→<1ポジ分のロットが0.9Lot>の時の<推奨証拠金は450万円>→なので、証拠金が450万円に届いたら、次に取るポジションは0.9Lotになるようにプログラミングする。
合計MAXロットが5Lot(内訳:1Lot×5)→<1ポジ分のロットが1Lot>の時の<推奨証拠金は500万円>→なので、証拠金が500万円に届いたら、次に取るポジションは1Lotになるようにプログラミングする。
パラメータで、MAXポジション数を3と設定した場合。
合計MAXロットが0.03Lot(内訳:0.01Lot×3)→<1ポジ分のロットが0.01Lot>の時の<推奨証拠金は3万円>
合計MAXロットが0.06Lot(内訳:0.02Lot×3)→<1ポジ分のロットが0.02Lot>の時の<推奨証拠金は6万円>→なので、証拠金が6万円に届いたら、次に取るポジションは0.02Lotになるようにプログラミングする。
以下は、MAXポジション数を5と設定した場合と同じ考え方です。
よろしくお願いいたします。
検索結果がありません。 |
検索結果がありません。 |
推奨証拠金をE
最大ポジション数をN
1ポジ分のロットをLとすると、
> 合計MAXロットが0.05Lot(内訳:0.01Lot×5)→<1ポジ分のロットが0.01Lot>の時の<推奨証拠金は5万円>
の関係から
すなわち
の関係が成立します。
有効証拠金は
AccountEquity()
という関数で取得できますので、Lをlots
, NをNumMaxPosition
という変数にすればとなり、このコードを利用してロットの更新ができます。
通常通りEAをご作成いただいた後、ソースコードを次のようにご修正ください。
変数の定義
最大ポジション数を表す変数
NumMaxPosition
を定義します。マジックナンバーの定義の下に、初期値を5として記載しておきます。
【修正前】
【修正後】
lotsを更新する処理の追加
全ての エントリーの直前に、前述のコードを追加します。
※下記では、例として
Magic1
に関する修正例を記載しています。【修正前】
【修正後】
以上でございます。
ご参考になりましたら幸いです。
ありがとうございました。
お世話になっております。
似たようなトピックでしたのでこちらに失礼します。
ロジックは正常に動作していますが、ロット数が一定で困っています。
ロット数をエントリーごとに調整したいと考えています。
損切りと利確はエントリー時に確定しています。
ロット数調整のコードの書き方をご教示いただけたらと幸いです。
具体的には以下の通りです。
ロングの場合、
1本前と2本前の足が条件を満たしたら最新の足始値でロングエントリー。
何本足が更新されても最終エントリー足の1本前と2本前の安値を下回ったら25000円の損切りになるように毎エントリーごとにロット数を調整したいです。
(エントリー時の値ー最終エントリー足の1本前と2本前の安値の安い方の値)×ロット数=25000円
自信ありません、、間違えてたら訂正お願いします。。
ショートの場合も教えていただきたいです。
もう一つ、コードを教えていただいたとして、どの部分でしょうか。
eaつくーるでのメイン処理の
double lots=
なのか、
買い売り注文の
if(Trade == false)の下にあるlots = Lots;
なのか
lots = 0.1; ←デフォルト
なのかわかりません。。
拙い文章ですが、どうぞよろしくお願いします
根本から説明いたしましょう。
ロット数と取引量、そして価格の関係は、FX会社・通貨ペアごとに異なる点に注意が必要です。
USD/JPYの取引で、1lot=10,000通貨単位の場合について説明しましょう。
1lotでエントリーしているときに、1ドルあたり1円の値動きが起きたとします。
この場合の損益は、10,000ドル×1円/ドル=10,000円となりますね。
同様に、x lotでエントリーしていて、1ドルあたりy 円の値動きが起きたときのことを考えます。
この場合、x lot = 10,000x 通貨ですから、損益は10,000x × y = 10,000xy 円です。
「エントリー時の価格」と「決済時の価格」の差を上記数式のyに対応させると、ご希望のロット数を求める数式は
という方程式をxについて解いて
となります。後はyをコードにすればOKですね。
ただし、ここで大きな問題があります。
yの値が0に近いとき、xの値が限りなく大きくなってしまいます。つまり、ロット数が大きくなりすぎて危険です。
yの大きさに制限を設けておくことをおすすめいたします。
例えば、「y > 1の場合のみlot数を計算する」等です。
(制限に引っかかった場合は、デフォルトのロット数でエントリーします)
それでは、実際にyを求めるコードを書いてみましょう。
エントリー時の価格は
エントリー足の1本前の足の安値は
エントリー足の2本前の足の安値は
です。yは価格差なので"diff_long"という変数名にすると、次のように表されます。
そして、diff_long > 1のときのみロットの計算を行います。
あとは、一連のコードをエントリーの直前のlotを決める部分に記載すれば完成です。
openPosition
という関数でエントリーを行うので、次のように修正してください。【修正前】
【修正後】
ショートの場合は、「エントリー時の足の直近2本の高値」で考えればOKです。価格差diff_shortのコードは次のようになります。
最後に。
「最終エントリー足の1本前と2本前の安値を下回ったら25000円の損切りになる」という条件を満たすように解説させていただきましたが、条件を満たすロット数はかなり大きなものになる場合がございます。
本回答を作成するにあたって弊社の方で検証を行った際は、ロット数が大きくなりすぎるのを避けるための制限(y > 1)に引っかかってしまい、そもそも希望通りのロット数が適用されないことが殆どでした。
理論上は前述の方法でご作成いただけますが、本当にこの手法で問題ないか、再度ご検討いただければ幸いです。
ご丁寧に分かりやすくありがとうございます
ご丁寧に分かりやすくありがとうございます
続けて恐れ入ります。
バックテストをしているのですが、
if (diff_long > 1) {
lots = 2.5 / diff_long;
}
の
1を0.01や、0と変えると動かなくて、
2.5も0.5など、に変えてもロット計算されてないような結果になったり、エントリー最初の1回だけで、後は動かないといった症状です。
原因教えて頂きたいです。。。
よろしくお願い致します。
「最終エントリー足の1本前と2本前の安値を下回ったら25000円の損切りになる」という条件でロットを計算すると、通常、ロット数がかなり大きくなってしまいます。
「エントリー最初の1回だけで、後は動かない」というご状況も、証拠金に対して ロットが多きすぎることが原因で、エントリーがスルーされてしまっている のだと存じます。("Not enough money"というエラーが発生しているはずです。)
根本としてロジックや数値の見直しが必要かもしれません。
「25000」という数値を小さくすれば解決する可能性がありますので、ご検討をお願いします。
ありがとうございます。
動くかどうかの確認の為にロングエントリー、決済のみのコードを作ってみたのですが、
2.5の部分を小さくすると確かにロット数調整はしているようです。
ですが損失額がバラバラなのはどこに問題があるのでしょうか?
損失額を一定にしたいのです。
コード一部です。
//メイン処理
//--------------------------------------------------------------------------------------------------------+
void OnTick()
{
int signal = 0;
double lots = Lots;
double take_profit = TakeProfit;
double stop_loss = StopLoss;
Trade = true;
if(Trade == false) return;
lots = Lots;
take_profit = TakeProfit;
stop_loss = StopLoss;
signal = 0;
if(iClose(Symbol(), 0, 2)+PipsToPrice(0) < iOpen(Symbol(), 0, 2)+PipsToPrice(0)
&& iClose(Symbol(), 0, 1)+PipsToPrice(0) > iHigh(Symbol(), 0, 2)+PipsToPrice(0)) signal = 1;
if(bars1 == Bars) signal = 0;
if(signal != 0 && getOpenLots(Magic1) == 0) {
double diff_long = iClose(Symbol(), 0, getLastEntryBar(Symbol(), 0, 0, Magic1)) - MathMin(iLow(Symbol(), 0, getLastEntryBar(Symbol(), 0, 1, Magic1)), iLow(Symbol(), 0, getLastEntryBar(Symbol(), 0, 2, Magic1)));
}
lots = Lots;
take_profit = TakeProfit;
stop_loss = StopLoss;
signal = 0;
if(iClose(Symbol(), 0, 0)+PipsToPrice(0) < iLow(Symbol(), 0, getLastEntryBar(Symbol(), 0, 1, Magic1))
&& iClose(Symbol(), 0, 0)+PipsToPrice(0) < iLow(Symbol(), 0, getLastEntryBar(Symbol(), 0, 2, Magic1))) signal = 1;
if(signal != 0 && getOpenLots(Magic1, OP_BUY) != 0) {
closePosition(Magic1, OP_BUY);
}
lots = Lots;
take_profit = TakeProfit;
stop_loss = StopLoss;
signal = 0;
if(iClose(Symbol(), 0, 0)+PipsToPrice(0) > iHigh(Symbol(), 0, getLastEntryBar(Symbol(), 0, 1, Magic1))) signal = 1;
if(signal != 0 && getOpenLots(Magic1, OP_BUY) != 0) {
closePosition(Magic1, OP_BUY);
}
}
//--------------------------------------------------------------------------------------------------------+
何度も申し訳ございません。
よろしくお願い致します。
大変失礼いたしました。
確認いたしましたところ、
diff_long
の計算式に関するコードが間違っておりました。具体的には、
getLastEntryBar
関数を用いていましたが、この関数は 前回の エントリー時のバーを参照しますので、 直近の 安値を取得することはできません。diff_long
の定義を次のように修正します。また、上記変更を行った場合でも、スプレッドの関係で損失額にずれが生じる可能性がございます。
現在は決済の条件を
としていると存じますが、これを
としてしまうのもアリかもしれません。○○円の部分を、ロット数を計算する際に用いた値にすれば、損失額に対応した適切なロット数を計算しつつ、実際の損失額はピッタリ目標通りにすることができると存じます。
なるほどです!
修正しましたところ動いております。
本当にありがとうございました。