[ARCHIVE] フォーラムを散らかさないように、どんなルーキーでも質問してください。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 3. - ページ 524

 
sss2019:

Expert Advisor がターミナルで 3 つの注文を開き、ある時点で 3 つの注文をすべて閉じるはずですが、なぜか 2 つだけ閉じ、何のエラーも出ません。

この作品は、トレードを終了する必要があります。

何が悪いのか、なぜ2件しか成約しないのか、理解できない。誰が何を知っているのか、教えてください。

if(OrderSelect(i, SELECT_BY_POS) == false) continue;
 
Vinin:


異なるサイクルを行う


これでもダメだったんですけどね。ループを並べ替えたり、continueを代用してもダメでした。まるでEAが自分の3つの注文を見ずに、2つだけ削除しているような感じです。

 
周期再計算の方向を反転させる
 
持って、使ってください。
ファイル:
 
時々、全く論理的でないわけのわからないことがあるので、端末環境自体にエラーがあるのではと思うことがあります。
 
sss2019:
時々、全く論理的でないわけのわからないことがあるので、端末環境自体にエラーがあるのではと思うことがあります。
それを少なく見せるためには、教科書やマニュアルを勉強することから始める必要があります。そして、フォーラムで似たような問題の解説を探してみてください。
 
sss2019:

EAの最大ドローダウンをどのように整理すればよいか、どの時点で動作が停止するか、損失額を蓄積する静的変数を設定できるか。

Expert Advisor が停止するはずですが、再起動したり、パラメータを変更すると再び動作するようになります。


EAの初期化時に、現在の残高を静的変数に 保存することができます。また、「スタート」機能では、現在の残高が当初より何%減少したかを確認し、その割合が許容範囲を超えている場合は取引を禁止することができます。簡単に、コードなしで。再起動後、Expert Advisorは新しい初期残高を記憶します...
 
MrSoros:

Expert Advisor の初期化時に、現在の残高を静的変数に保存することができます。また、スタート機能では、現在の残高が初期残高からどれだけずれているかを確認し、その割合が許容範囲を超えている場合は、取引を禁止することができます。簡単に、コードなしで。再起動後、Expert Advisor は新しい初期残高を記憶します。

質問を理解しましたか?
 
MrSoros:

1.Expert Advisor の初期化時に、現在の残高を静的変数に保存することができます。そして、スタート機能は、現在の残高が最初の残高から何%減少したかをチェックし、その割合が高ければ取引を禁止する。簡単に言うと、コードなし。

2.再起動後、アセッサは新しい元の残高を記憶します...

1.できます。私はこのオプション(コード付き)を持っている - あなた自身が変数を初期化する。

extern int MaxLoss = 90;          // Максимально допустимая просадка в процентах от баланса
int  orderIndex;
bool IsExpertFailed = false;
bool IsExpertStopped = false;
double lots;                       // вспомогательная переменная для расчета нового размера лота 
double Lots_New;                   // Количество лотов для новых ордеров
int ticket;                        // Номер ордера
double orderLots;                  // Lots   
double orderProfit;                // Profit
double Price;                      // Цена открытия рыночного ордера
double SL;                         // Значение StopLoss ордера
double  TP;                        // Значение TakeProfit ордера
static datetime prevtime = 0;       // по ценам открытия
int start()
{  
   if (IsExpertStopped)
   {
      Comment("Не удалось инициализировать советник!");
      return (0);
   }
   
   if (IsExpertFailed)
   {
      Comment("Критическая ошибка! Советник остановлен.");
      return (0);
   }
      Level_new=MarketInfo(Symbol(),MODE_STOPLEVEL );    
 
   int orderCount = 0;  
      // ------------------------------------------------Учет ордеров только ЭТОГО ЭКСПА---------------------------

   int orderType;
   for (orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
     {  
      if (!OrderSelect(orderIndex, SELECT_BY_POS))    continue;
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic))    continue;

      orderType = OrderType();
      if ((orderType != OP_BUY) && (orderType != OP_SELL))     continue;
          ticket = OrderTicket( );                         // Номер ордера
          orderLots = OrderLots();                         // Lots   
          orderProfit = OrderProfit() + OrderSwap();       // Profit
          Price = OrderOpenPrice();                        // Цена открытия рыночного ордера
          SL =  OrderStopLoss();                           // Значение StopLoss ордера
          TP = OrderTakeProfit();                          // Значение TakeProfit ордера
          
             if (ticket>0)                                               // Если позиция открылась
                    {
                             while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                                 {
                                   Sleep(100);
                                 }
                                  double OpenPrice=OrderOpenPrice();
                    }
          // Проверка на предельную просадку      
      double loss = - ((orderProfit * 100.0) / AccountBalance());
      if (loss > MaxLoss)
      {
         Print ("MaxLoss");
         CloseAllOrders(magic);
         IsExpertFailed = true;
         return (0);
      }        
         
      orderCount++;                     // считаем ордера (не больше i)                   
     
    }   

2.このEXPERTの初回起動前のバランスレベルは記憶しません。現在のレベルのみを変数に記憶します

AccountBalance()

.このアカウントに対して

 

こんにちは!以前、エクセルでの引用符の正しい表現について質問させていただいたものです。この質問は、costy さんのおかげで解決しました。さて、質問ですが、アップロードする通貨を増やすためのデータを(MQL5とdllなしで)作ることは可能でしょうか?模 式図は以下の通りです。"... "の代わりに、対応する日付の値、終値の値、現在の期間を表示します。

この質問に対する回答は、私のコードの修正の可能性を含むものだと思います。現在の金融商品の終値の値をファイルに書き込むExpert Advisorのコードを添付しています。

#property copyright "S.I.Shlikov"
#property link      ""
int init()  
  {
   string Name=Symbol();
   int h=FileOpen(Symbol()+"-"+Period()+".csv",FILE_CSV|FILE_WRITE|FILE_READ,";");
    if(h<1)
      {
      Print("Файл не найден : ", GetLastError());
      return(false);
      }
   FileSeek(h, 0, SEEK_END);
   FileWrite(h,"Date",Name,"Period",Period());
   FileClose(h);        
  }
int start()
  {
   int h=FileOpen(Symbol()+"-"+Period()+".csv",FILE_CSV|FILE_WRITE|FILE_READ,";");
    if(h<1)
      {
      Print("Файл не найден : ", GetLastError());
      return(false);
      }
   string Wtime=TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES);
   FileSeek(h, 0, SEEK_END);
   FileWrite(h,Wtime,NormalizeDouble(Close[0], Digits));
   FileClose(h);   
   return(0);
  }