解決済み

pipsでなく、%で利確損切りする設定方法

EAつくーる
いちやま
2024/08/26 11:10
299

古いEA(エキスパートアドバイザー)が使用される理由の一つとして、利確や損切の設定がpipsベースで行われていることが挙げられます。pipsで設定した場合、その時点の価格に左右されやすくなってしまう問題があります。

例えば、ドル円が1ドル100円から101円になった場合、または1ドル150円から151円になった場合、どちらも100pipsの値動きとなります。しかし、100円と150円では1円の価値が異なるにもかかわらず、同じようにトレードしてしまうことになります。

極端な例を挙げると、1ドルが1円から2円に動いた場合は100%の変動になりますが、1ドルが100円から101円に動いた場合は1%の変動に過ぎません。

このため、利確と損切の設定をpipsではなく、%ベースで行いたいと考えています。

コメント

いちやま
2024/08/26 11:13

訂正の文章です。

古いEA(エキスパートアドバイザー)と言われる理由の一つとして、利確や損切の設定がpipsベースで行われていることが挙げられます。pipsで設定した場合、その時点の価格に左右されやすくなってしまう問題があります。

例えば、ドル円が1ドル100円から101円になった場合、または1ドル150円から151円になった場合、どちらも100pipsの値動きとなります。しかし、100円と150円では1円の価値が異なるにもかかわらず、同じようにトレードしてしまうことになります。

極端な例を挙げると、1ドルが1円から2円に動いた場合は100%の変動になりますが、1ドルが100円から101円に動いた場合は1%の変動に過ぎません。

このため、利確と損切の設定をpipsではなく、%ベースで行いたいと考えています。

GogoJungle
2024/08/28 14:55

ご希望の機能は、通常通りEAを作成いただいた後、コードを一部修正することで実現可能です。
openPositionという関数の中身の一部を、下記例を参考にご修正ください。

修正前

   switch(signal) {
      case 1:
         type = OP_BUY;
         price = Ask;
         if(tp_pips > 0) tp = Ask + PipsToPrice(tp_pips);
         if(sl_pips > 0) sl = Ask - PipsToPrice(sl_pips);
         break;
      case -1:
         type = OP_SELL;
         price = Bid;
         if(tp_pips > 0) tp = Bid - PipsToPrice(tp_pips);
         if(sl_pips > 0) sl = Bid + PipsToPrice(sl_pips);
         break;
      default:
         return(false);
         break;
   }

修正後

   switch(signal) {
      case 1:
         type = OP_BUY;
         price = Ask;
         if(tp_pips > 0) tp = Ask * (1 + tp_pips / 100);
         if(sl_pips > 0) sl = Ask * (1 - sl_pips / 100);
         break;
      case -1:
         type = OP_SELL;
         price = Bid;
         if(tp_pips > 0) tp = Bid * (1 - tp_pips / 100);
         if(sl_pips > 0) sl = Bid * (1 + sl_pips / 100);
         break;
      default:
         return(false);
         break;
   }

なお、今回の修正では、tp_pips, sl_pipsという変数を、pipsではなく%を単位とした現在値からのずれとして扱います。これに伴い、EAつくーる本体でコードを生成する際には、損切り・利食いの入力欄の単位をpipsから%に置き換えてお考えください。

例えば、「現在値から5%不利な方向に動いたら損切り、10%有利な方向に動いたら利食い」という条件にする場合は、下記画像のように各値を入力します。
LABO_1897_2.png

いちやま
2024/08/28 23:06

ありがとうございます!

いちやま
2024/08/29 03:34

ナンピンの利確損切を%にする場合はどうすればいいんですか?

いちやま
2024/08/29 18:38

ナンピンのエントリー間隔や利確損切のpipsを%にするにはどうしたらよいでしょうか?

GogoJungle
2024/08/29 20:49

ナンピンの場合は、割合を決める基準となる価格の定義が重要であると存じます。
例えば、買いポジションで初回のエントリー時の価格が「100」だったとして、「エントリー間隔=10%」とした場合について考えてみましょう。

常に初回エントリー時の価格を基準とする場合

1回目:100 - 100 × 10% = 90 まで下落したらエントリー
2回目: 90 - 100 × 10% = 80 まで下落したらエントリー
3回目: 80 - 100 × 10% = 70 まで下落したらエントリー

前回のエントリー時の価格を基準とする場合

1回目:100 - 100 × 10% = 90   まで下落したらエントリー
2回目: 90 -  90 × 10% = 81   まで下落したらエントリー
3回目: 81 -  81 × 10% = 72.9 まで下落したらエントリー

このように、基準とする価格の定義によって計算方法が変化します。
また、利確・損切についても同様です。

基準を提示していただければ、それに沿った方法でコードの修正案をお伝えできるかもしれません。

いちやま
2024/08/30 02:05

①CFDのゴールド通貨(反転リバーサル終了時のレンジ戦略EA)
初回エントリー時の価格を基準
ナンピン
(1月当たりの2000円台を基準を考える)
エントリー間隔 100 初回エントリーの価格から 0.05%
利確 200 初回エントリーの価格から 0.1%
損切 1000 初回エントリーの価格から0.5%

②CFDのゴールド通貨(レンジ終了時のブレイク戦略EA)  作成中
初回エントリー時の価格を基準
ピラミッテング
エントリー間隔 300 初回エントリーの価格から 0.15%
利確 2000 初回エントリーの価格から 1%
損切 3000 初回エントリーの価格から1.5%

③CFDのゴールド通貨(ブレイク終了時の反転リバーサル戦略EA)  
初回エントリー時の価格を基準
ナンピン
エントリー間隔 1000 初回エントリーの価格から0.5%
利確 500       初回エントリーの価格から0.25%
損切 3000 初回エントリーの価格から1.5%

3つほどお願いします

いちやま
2024/08/30 17:09

訂正文

初回エントリー価格でお願いします
(※ゴールド2000円を基準を基準に考えて%を考えてみました)

①CFDのゴールド(反転リバーサル終了時のレンジ戦略EA)
ナンピン
エントリー間隔 初回エントリーの価格から 0.1%(200pips)
利確 初回エントリーの価格から 0.1% (200pips)
損切 1000 初回エントリーの価格から0.5% (1000pips)

②CFDのゴールド(レンジ終了時のブレイク トレンドフォロー戦略EA)
ピラミッテング
エントリー間隔 初回エントリーの価格から 0.1%(200pips)
利確 初回エントリーの価格から 0.15%(300pips)
損切 初回エントリーの価格から 0.3% (600pips)

③CFDのゴールド通貨(ブレイク終了時の反転リバーサル戦略EA)  検証中
初回エントリー時の価格を基準
ナンピン
エントリー間隔 初回エントリーの価格から0.15%(300)
利確 初回エントリーの価格から0.15%(300)
損切 初回エントリーの価格から0.3%(600 )

こんな感じで3種類のEAを組みたいのでお願いします

GogoJungle
2024/09/02 19:55

詳細なご説明、ありがとうございます。
どのEAも初回エントリー時の価格を基準としていますので、ナンピンを実行する関数自体を同じ条件で変更すればよいことがわかりました。
「ナンピン」オプションの「エントリー間隔」「利食い」「損切り」の項目を、全てpipsではなく初回エントリー時の価格からのずれ(%)として設定後、下記を参考に全7か所のコードを修正することでご作成いただけることと存じます。

NanpinLogic関数内のコード

1. 変数の定義

修正前

void NanpinLogic(
   int max,
   int is_custom,
   string clots,
   double interval,
   double mult,
   double tp,
   double sl,
   double add,
   double limit,
   int &magic[])
{
   double price, total, lots; // ←この1行を変更
   int count, type;

修正後

void NanpinLogic(
   int max,
   int is_custom,
   string clots,
   double interval,
   double mult,
   double tp,
   double sl,
   double add,
   double limit,
   int &magic[])
{
   double price, first_price, total, lots; // ←変更後
   int count, type;

2. getNanpinInfo関数の引数

修正前

      getNanpinInfo(magic[i], type, price, count, total, lots);

修正後

      getNanpinInfo(magic[i], type, price, first_price, count, total, lots);

3. 決済の条件

修正前

      if(price > 0) {
         if((total > tp && tp != 0) || (total * -1 > sl && sl != 0)) { // ←この1行を変更
            if(closePosition(magic[i], type) == true) return;
         }
      }

修正後

      if(price > 0) {
         if((total > PriceToPips(first_price * tp / 100) && tp != 0) || (total * -1 > PriceToPips(first_price * sl / 100) && sl != 0)) { // ←変更後
            if(closePosition(magic[i], type) == true) return;
         }
      }

4. 買いエントリーの条件

修正前

      if(type == OP_BUY && Ask <= (price - PipsToPrice(interval))) { // ←この1行を変更
         if(is_custom == 0) {
            if(add == 0){
               openPosition(1, MathMin(lots * MathPow(mult, count + 1), limit), 0, 0, magic[i]);
            }

修正後

      if(type == OP_BUY && Ask <= (price - first_price * interval / 100)) { // ←変更後
         if(is_custom == 0) {
            if(add == 0){
               openPosition(1, MathMin(lots * MathPow(mult, count + 1), limit), 0, 0, magic[i]);
            }

5. 売りエントリーの条件

修正前

      if(type == OP_SELL && Bid >= (price + PipsToPrice(interval))) { // ←この1行を変更
         if(is_custom == 0) {
            if(add == 0){
               openPosition(-1, MathMin(lots * MathPow(mult, count + 1), limit), 0, 0, magic[i]);
            }

修正後

      if(type == OP_SELL && Bid >= (price + first_price * interval / 100)) { // ←変更後
         if(is_custom == 0) {
            if(add == 0){
               openPosition(-1, MathMin(lots * MathPow(mult, count + 1), limit), 0, 0, magic[i]);
            }

getNanpinInfo関数内のコード

6. 変数の定義

修正前

void getNanpinInfo(
   int    magic,
   int    &type,
   double &entry_price,
   int    &count,
   double &total,
   double &lots)
{

修正後

void getNanpinInfo(
   int    magic,
   int    &type,
   double &entry_price,
   double &first_entry_price, // ←この1行を追加
   int    &count,
   double &total,
   double &lots)
{

7. 初回エントリー時の価格を追加

修正前

   for(i = 0; i < OrdersTotal(); i++) {
      if(OrderSelect(i, SELECT_BY_POS) == false) break;
      if(OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;

      if(first_time == 0 || OrderOpenTime() < first_time) {
         type = OrderType();
         entry_price = OrderOpenPrice();
         first_time = OrderOpenTime();
         lots = OrderLots();
      }
   }

   if(first_time == 0) return;

修正後

   for(i = 0; i < OrdersTotal(); i++) {
      if(OrderSelect(i, SELECT_BY_POS) == false) break;
      if(OrderSymbol() != Symbol() || OrderMagicNumber() != magic) continue;

      if(first_time == 0 || OrderOpenTime() < first_time) {
         type = OrderType();
         entry_price = OrderOpenPrice();
         first_time = OrderOpenTime();
         lots = OrderLots();
      }
   }

   first_entry_price = entry_price; // ←この1行を追加
   if(first_time == 0) return;

関連トピックス

検索結果がありません。

ノーコードで誰でも簡単EA開発!MQL言語学習にも使える! | GogoJungle

注目トピックス

検索結果がありません。