どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 386

 
alexey1979621:
ありがとうございます、あなたのコードを分解してみました。確かに開くときにエラーが出ます(もう目がビショビショです)。修正したEAをデモに投入したところ、すでに当社のメイジックのオープンポジションがあり、トータルでプラスになっています。しかし、このポジションは閉鎖されていません。

新しいコード(投稿の下の方です)では、関数に渡されるデフォルトのパラメータが変更されていますね。

int NumberOfPositions(string sy="", int op=-1, int mn=1114)

オリジナル版では、別のマジックを搭載していました。私のコードでこの関数を参照していたのを修正しました。どのマジックの注文が今開いているかを見て、このマジックの数をEAに設定します。

追伸:変数の命名に異なるエンコーディングを使用することは、良いフォームの兆候ではありません...。という意味です。

extern string Сomment           = "KVAZ_EURUSD_GBPUSD";
 
Roger:


この行を見てください

else if (order_type = OP_SELL())

そして、この1枚。

if (order_type = OP_BUY)
 
TarasBY:

新しいコード(投稿の下の方です)では、関数に渡されるデフォルトのパラメータが変更されていますね。

オリジナル版では、別のマジックを搭載していました。私のコードでこの関数を参照していたのを修正しました。どのマジックの下で注文が開かれているかを調べ、そのマジックの番号をEAに記入する。


いや、マジレスすると、EURAUDUSD用は1111、EURUSD_GBPUSD用は1114が正しい(他の人に手伝ってもらい修正した)。 両トレードがクローズしない。EURUSD_GBPUSDの総利益を見ているのですが、Expert Advisorが決済できないのです。私はEURAUD_AUDUSD - 1111のためにあなたのバージョンを修正しました EURUSD_GBPUSD - 1114、それはまだ取引を閉じることはありません。フクロウの特徴は、テスターでテストできないこと(2ペア取引されるため)-デモでしかテストできないことです。
 
alexey1979621:

いいえ、メイジは正しく、EURAUD_AUDUSDのものは1111、EURUSD_GBPUSDのものは1114です(他の方に手伝っていただいて修正しました)。 両トレードがクローズしない。EURUSD_GBPUSDの総利益を見ているのですが、Expert Advisorが決済できないのです。私はEURAUD_AUDUSD - 1111のためにあなたのバージョンを修正しました EURUSD_GBPUSD - 1114、それはまだ取引を閉じることはありません。フクロウの特徴は、テスターでテストできないこと(2ペア取引されるため)-デモでしかテストできないことです。


何か変化を起こそう。の代わりに

if(prof>=Profit)
   {
  for(int i=OrdersTotal()-1;i>=0;i--) 
      {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
     double AS=MarketInfo(OrderSymbol(), MODE_ASK);
     double BI=MarketInfo(OrderSymbol(), MODE_BID);

       if(OrderType()==OP_BUY) price=BI;
       else                    price=AS;

       OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE);
         }
      }   
   }

置く

Comment("Profit = ",prof);
if(prof>=Profit)
   {
Print("Profit is good!");
  for(int i=OrdersTotal()-1;i>=0;i--) 
      {
     if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
     double AS=MarketInfo(OrderSymbol(), MODE_ASK);
     double BI=MarketInfo(OrderSymbol(), MODE_BID);

       if(OrderType()==OP_BUY) price=BI;
       else                    price=AS;
       Print("OrderTicket - ",OrderTicket()," price - ",price);
       if(!OrderClose(OrderTicket(),OrderLots(),price,3,CLR_NONE))Print ("Error - ",GetLastError());
         }
      }   
   }
EAを実行し、利益をゼロに設定し、何が出てきたか、何がログに残っているかを確認します。
 
Roger:


この行を見てください

else if (order_type = OP_SELL())


おつかれさまでした!)
 
alexey1979621:

EURAUD_AUDUSDは1111、EURUSD_GBPUSDは1114です(他の方が修正してくれました)。 両トレードがクローズしない。EURUSD_GBPUSDの総利益を見ているのですが、Expert Advisorが決済できないのです。私はEURAUD_AUDUSD - 1111のためにあなたのバージョンを修正しました EURUSD_GBPUSD - 1114、それはまだ取引を閉じることはありません。フクロウの特徴は、テスターでテストできないこと(2ペア取引されているため)-デモでしかテストできないことです。

まず、インジケーターに正しく対応できていない。この指標は外部パラメータを多く持っています。

extern string Symbol1.Name      = "EURUSD";// Название инструмента 1
extern bool   Symbol1.Reverse   = false;   // Является ли инструмент 1 реверсивным (с обратной корреляцией) 
                                           // по отношению к остальным инструментам
extern string Symbol2.Name      = "USDCHF";// Название инструмента 2
extern bool   Symbol2.Reverse   = false;   // Является ли инструмент 2 реверсивным (с обратной корреляцией) 
                                           // по отношению к остальным инструментам
extern string  ___MISC___       = " == Прочие настройки ==========";
extern bool   UseVolatility     = True ;   //отрисовка с учетом волатильности
extern bool   Triangle          = True ;   // Рисовать треугольник?
extern color  Triangle.Color    = DarkSalmon; // Цвет треугольника
extern double Alert.ChannelMore = EMPTY;   // Если ширина канала больше указанной, включается сигнал
                                           //   -1 - контроль выключен.
extern double Alert.ChannelLess = EMPTY;   // Если ширина канала меньше указанной, включается сигнал
                                           //   -1 - контроль выключен.
extern string  __VOL___         = " == Расчет объемов ====";
extern int VOL.Mode             = 3;       // Режим расчета объемов для торговли
                                           //   1 - по ценам открытия
                                           //   2 - по волатильности, а если невозможно - по ценам открытия
                                           //   3 - по волатильности (если возможно) и ценам открытия
extern int VOL.PeriodATR        = 144;            // Период усреднения ATR 
extern string  ___MA___         = " == Параметры МА ценовых линий ====";

extern int MA.Slow              = 21;      // Период медленной МА
extern int MA.Fast              = 8;       // Период быстрой МА
extern int MA.Method            = 2;       // Метод аппроксимации
                                           // - MODE_SMA=0 Простое скользящее среднее 
                                           // - MODE_EMA=1 Экспоненциальное скользящее среднее 
                                           // - MODE_SMMA=2 Сглаженное скользящее среднее 
                                           // - MODE_LWMA=3 Линейно-взвешенное скользящее среднее 
extern int MA.Price             = 6;       // Расчетная цена:
                                           // - PRICE_CLOSE=0 Цена закрытия 
                                           // - PRICE_OPEN=1 Цена открытия 
                                           // - PRICE_HIGH=2 Максимальная цена 
                                           // - PRICE_LOW=3 Минимальная цена 
                                           // - PRICE_MEDIAN=4 Средняя цена, (high+low)/2 
                                           // - PRICE_TYPICAL=5 Типичная цена, (high+low+close)/3 
                                           // - PRICE_WEIGHTED=6 Взвешенная цена закрытия, (high+low+close+close)/4 

で、インジケータを呼び出す際に記載する必要があります。省略した場合、パラメータはデフォルトで取得され、異なる通貨ペアで使用したいので、このオプションは適しません。あとは、EA起動時のパラメータ変更を考慮すればすべてOKです。

extern string Symbol_1 = "EURAUD";
extern string Symbol_2 = "AUDUSD";
extern double Lot_1=0.01;
extern double Lot_2=0.01;
extern double Profit=10;
extern string EXP_Comment           = "KVAZ_";
extern int    Magic                 = 1111;

string gsa_SMB[2];
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
  gsa_SMB[0] = Symbol_1;
  gsa_SMB[1] = Symbol_2;
  EXP_Comment = StringConcatenate (EXP_Comment, Symbol_1, "_", Symbol_2);
   return (0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
    int    li_N;
    double prof = 0., ld_Price = 0.;

    for (int i = OrdersTotal() - 1; i >= 0; i--)
    {
        OrderSelect (i, SELECT_BY_POS);
        li_N = fGet_NumSymbol (OrderSymbol(), gsa_SMB);
        if (li_N < 0) continue;
        if (OrderMagicNumber() != Magic) continue;
        prof += OrderProfit();
        Print ("Profit=", prof);
    }
    if (prof >= Profit)
    {
        for (i = OrdersTotal() - 1; i >= 0; i--)
        {
            OrderSelect (i, SELECT_BY_POS);
            li_N = fGet_NumSymbol (OrderSymbol(), gsa_SMB);
            if (li_N < 0) continue;
            if (OrderMagicNumber() != Magic) continue;
            if (OrderType() == OP_BUY) ld_Price = MarketInfo (gsa_SMB[li_N], MODE_BID);
            else if (OrderType() == OP_SELL) ld_Price = MarketInfo (gsa_SMB[li_N], MODE_ASK);
            OrderClose (OrderTicket(), OrderLots(), ld_Price, 5);
        }
    }
    double lda_Price[2],
           Line_1 = iCustom (Symbol(), 0, "Ind_2 Line+1", 0, 1), // Первый инструмент
           Line_2 = iCustom (Symbol(), 0, "Ind_2 Line+1", 1, 1); // Второй инструмент

    if (NumberOfPositions (gsa_SMB[0], -1, Magic) == 0)
    {
        lda_Price[0] = MarketInfo (gsa_SMB[0], MODE_BID);
        lda_Price[1] = MarketInfo (gsa_SMB[0], MODE_ASK);
        if (Line_1 > 0.1) if (Line_2 < -0.1)
        {OrderSend (gsa_SMB[0], OP_SELL, Lot_1, lda_Price[0], 3, 0, 0, EXP_Comment, Magic, 0, Red);}
        if (Line_1 < -0.1) if (Line_2 > 0.1)
        {OrderSend (gsa_SMB[0], OP_BUY, Lot_1, lda_Price[1], 3, 0, 0, EXP_Comment, Magic, 0, Blue);}
    }
    if (NumberOfPositions (gsa_SMB[1], -1, Magic) == 0)
    {
        lda_Price[0] = MarketInfo (gsa_SMB[1], MODE_BID);
        lda_Price[1] = MarketInfo (gsa_SMB[1], MODE_ASK);
        if (Line_1 < -0.1) if (Line_2 > 0.1)
        {OrderSend (gsa_SMB[1], OP_BUY, Lot_2, lda_Price[1], 3, 0, 0, EXP_Comment, Magic, 0, Blue);}
        if (Line_1 > 0.1) if (Line_2 < -0.1)
        {OrderSend (gsa_SMB[1], OP_SELL, Lot_2, lda_Price[0], 3, 0, 0, EXP_Comment, Magic, 0, Red);}
    }
    return (0);
}
//+------------------------------------------------------------------+
int fGet_NumSymbol (string fs_Symbol, string ar_SMB[])
{
    for (int li_IND = 0; li_IND < 2; li_IND++)
    {if (fs_Symbol == ar_SMB[li_IND]) return (li_IND);}
    return (-1);
}
//+------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=1111)
{
  int i, k=OrdersTotal(), kp=0;
  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) kp++;
          }
        }
      }
    }
  }
  return(kp);
}
//+------------------------------------------------------------------+

インジケーターコールの様子はこちら

 
Roger:


何か変化を起こそう。の代わりに

置く

EAを実行し、利益をゼロに設定し、何が出てきたか、何がログに残っているかを確認します。


その結果は醜いものです。あなたの変更と利益が0になったので、Expert AdvisorはMeijic 1111, 1112, 1113, 1114, 1115のすべてのポジションを閉じました。そして、5秒後にこれらのメイジックのシンボルに対する新しい注文が出され、10秒後にすべてクローズされ、また同じことが起こったのです。ポジションは2つ1組ではなく、カオス的に開かれた。
 
alexey1979621:

これは怖いことになりましたね。あなたの変更と利益が0に等しい場合、EAはMajic 1111, 1112, 1113, 1114, 1115のすべてのポジションを全く閉じました。そして、5秒後にこれらのメイジックのシンボルに対する新しい注文が出され、10秒後にすべてクローズされ、また同じことが起こったのです。ポジションは2つ1組ではなく、カオス的に開かれた。


私の誘導尋問ですが、この口座にはいくつのEAがあるのでしょうか?

そして、利益確定ですべての注文を決済するという条件もありましたね。

PS このEAの落とし穴は、決済後に注文を出し続けることで、最終的に損失が発生することがわかりましたね。だから、その条件が過ぎて再び発生するまでは、新規発注を禁止するフラグを立てる必要があるのです。

 
TarasBY:

まず、インジケーターに正しく対応できていない。この指標は外部パラメータを多く持っています。

で、インジケータを呼び出す際に記載する必要があります。省略した場合、パラメータはデフォルトで取得され、異なる通貨ペアで使用したいので、このオプションは適しません。あとは、EA起動時のパラメータ変更を考慮すればOKです。

インジケーターの呼び出しについては、こちらを ご覧ください。

ありがとうございます。インジケーターコールのことは知っています。しかし、インジケーターの調整可能なパラメーターは、テストや運用で適用する際に記載する必要があります。 このEAはテスターでテストできないため(2ペアで取引されるため)、ヒストリー上でこれらのパラメーターを選択することは不可能です。あなたの最後のバリエーションはすでにデモで実装されています。 私は、トレードがどのように終了するかを見てみます。もう一つ小さな質問ですが、2つの商品の取引は買いか売りのどちらかで開きますが、ある商品は売りで、別の商品は買いで開く必要がある場合、どのように開けばよいのでしょうか?いろいろと調べてみたのですが、ダメでした.改めて、お疲れ様でした。
 
Roger:


誘導尋問 - この口座にはいくつのEAがあるのでしょうか?

そして、利益確定ですべての注文を決済するという条件もありましたね。

PS このEAの落とし穴は、決済後に注文を出し続けることで、最終的に損失が発生することがお分かりいただけたと思います。だから、その条件が過ぎて再び発生するまでは、新規発注を禁止するフラグを立てる必要があるのです。


5つのExpert Advisor(双子の兄弟-異なるペアのために)が、もちろん異なるMeijicで動作していました。


はい、注文を決済するための利益条件はありましたが、注文は例えばMAJIC1114とあるEAに関連したものでした。私は最初からこのことを書き、フクロウは決算時に自分の注文を見ていないと信じていました。しかし、フクロウはすべての注文を見ており、とても決算したいのですが、すべての注文ではなく、特定の注文が必要であることがわかりました。

H4期間を例にとると、指標ラインが 0.1より高く、-0.1より低い場合、条件を満たして取引開始、つまり1つのシグナルで複数の利益を得ることが可能です(指標ラインが収束したら取引終了という選択肢もあります)。