MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 1530

 
Andrey Sokolov:

なるほど、ありがとうございます。他に何かヒントをお持ちの方はいらっしゃいますか?

私も一緒に学びました。

ミドルバッファ

//+------------------------------------------------------------------+
//|                                                  Demo_iBands.mq5 |
//|                                  Copyright 2021, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

//--- входные параметры
input int                  bands_period=20;           // период скользящей средней
input int                  bands_shift=0;             // сдвиг
input double               deviation=2.0;             // кол-во стандартных отклонений
input ENUM_APPLIED_PRICE   applied_price=PRICE_CLOSE; // тип цены
//--- переменная для хранения хэндла индикатора iBands
int    handle;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- создадим хэндл индикатора
   handle=iBands(_Symbol,_Period,bands_period,bands_shift,deviation,applied_price);
//--- если не удалось создать хэндл
   if(handle==INVALID_HANDLE)
     {
      //--- сообщим о неудаче и выведем номер ошибки
      PrintFormat("Не удалось создать хэндл индикатора iBands для пары %s/%s, код ошибки %d",
                  _Symbol,
                  EnumToString(_Period),
                  GetLastError());
      //--- работа индикатора завершается досрочно
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(handle!=INVALID_HANDLE)
      IndicatorRelease(handle);
//--- почистим график при удалении индикатора
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//--- индикаторные буферы
   double         UpperBuffer[];
   double         LowerBuffer[];
   double         MiddleBuffer[];
//--- количество копируемых значений из индикатора iBands
   int values_to_copy=2;
//--- если FillArraysFromBuffer вернула false, значит данные не готовы - завершаем работу
   if(!FillArraysFromBuffers(MiddleBuffer,UpperBuffer,LowerBuffer,bands_shift,handle,values_to_copy))
      return;
//--- сформируем сообщение
   Print("MiddleBuffer =",MiddleBuffer[0], "UpperBuffer =",UpperBuffer[0], "LowerBuffer =",LowerBuffer[0], "values_to_copy =",values_to_copy);
  }
//+------------------------------------------------------------------+
//| Заполняем индикаторные буферы из индикатора iBands               |
//+------------------------------------------------------------------+
bool FillArraysFromBuffers(double &base_values[],     // индикаторный буфер средней линии Bollinger Bands
                           double &upper_values[],    // индикаторный буфер верхней границы
                           double &lower_values[],    // индикаторный буфер нижней границы
                           int shift,                 // смещение
                           int ind_handle,            // хэндл индикатора iBands
                           int amount                 // количество копируемых значений
                          )
  {
//--- сбросим код ошибки
   ResetLastError();
//--- заполняем часть массива MiddleBuffer значениями из индикаторного буфера под индексом 0
   if(CopyBuffer(ind_handle,0,-shift,amount,base_values)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки
      PrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
      return(false);
     }
//--- заполняем часть массива UpperBuffer значениями из индикаторного буфера под индексом 1
   if(CopyBuffer(ind_handle,1,-shift,amount,upper_values)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки
      PrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
      return(false);
     }
//--- заполняем часть массива LowerBuffer значениями из индикаторного буфера под индексом 2
   if(CopyBuffer(ind_handle,2,-shift,amount,lower_values)<0)
     {
      //--- если копирование не удалось, сообщим код ошибки
      PrintFormat("Не удалось скопировать данные из индикатора iBands, код ошибки %d",GetLastError());
      //--- завершим с нулевым результатом - это означает, что индикатор будет считаться нерассчитанным
      return(false);
     }
//--- все получилось
   return(true);
  }
//+------------------------------------------------------------------+
 
昨日のインジケータでEAをスケッチしたのですが、何かうまく動きません。シグナルに基づかない取引を行うようです。反対側のシグナルでクローズオーダーを追加しようとしましたが、取引がクローズされた後、クローズされません。条件に間違いがないか、手がかりがあります。
input int Magic = 000;
input double Lots = 0.1;
input int TakeProfit = 100;
input int StopLoss = 50;
input int Slippage = 5;

double vverh,vnuz,SL,TP;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  /* if (Digits == 3 || Digits == 5)
   {
      TakeProfit *=10;
      StopLoss *=10;
      Slippage *=10;
   }*/
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
           
     
      vverh = iCustom(NULL,0,"777",0,1); // стрелка вверх
      vnuz = iCustom(NULL,0,"777",1,1); // стрелка вниз
      
     //-----------------------------------------------------------
     if (CountSell() == 0 && vnuz >0)
      {
      tiket = OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0, Red);
      if (tiket>0)
         {
         SL=NormalizeDouble(Bid+StopLoss*Point,Digits);
         TP=NormalizeDouble(Bid-TakeProfit*Point,Digits);
         if (OrderSelect(tiket, SELECT_BY_TICKET))
            if (!OrderModify(tiket,OrderOpenPrice(),SL,TP,0))
               Print("Ошибка модификации ордера на продажу");
         } else Print("Ошибка открытия ордера на продажу");
      }
      
      ////////////////////////////////////////////////////////////////
    if (CountBuy() == 0 && vverh >0)
      {
      tiket = OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue);
      if (tiket>0)
         {
         TP=NormalizeDouble(Ask+TakeProfit*Point,Digits);
         SL=NormalizeDouble(Ask-StopLoss*Point,Digits);
         if (OrderSelect(tiket, SELECT_BY_TICKET))
           if (!OrderModify(tiket,OrderOpenPrice(),SL,TP,0))
           Print("Ошибка модификации ордера на покупку");
         } else Print("Ошибка открытия ордера на покупку");
      }  
     
      
  }
//+------------------------------------------------------------------+
int CountSell()
{
   int count =0;
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
   if (OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
      {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType() == OP_SELL)
         count++;
      }
   }
   return(count);
}
//+------------------------------------------------------------------+
int CountBuy()
{
   int count =0;
   for (int trade = OrdersTotal()-1; trade>=0; trade--)
   {
   if (OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
      {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
         count++;
      }
   }
   return(count);
}
ファイル:
 
PapaYozh:

ただ、動かなくなったり、断続的に 動作したりしても驚かないでください。

どんな理由で?何が問題なのか書いてみたらどうだ?

 
Andrey Sokolov:

どんな理由で?何が問題なのか言ったらどうなんだ?

なんだ、この嫌がらせは?

 
PapaYozh:

なんだ、ひき逃げか。

なるほど。

何が悪いのか、本当に悪いのならどういう理由で動かなくなるのか、どなたか教えてください。

 
Andrey Sokolov:

なるほど。

もし本当に何か問題があるのなら、どういう理由で動作しなくなるのか、どなたか教えてください。

これが答えです

トレーディング、自動売買システム、ストラテジーテストに関するフォーラム

MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。

イゴール・マカヌ さん 2021.07.05 14:16.

なぜなら、その指標はまだ算出されていないからです。

https://www.mql5.com/ru/docs/series/barscalculated


OnInit()セクションは、ターミナル環境を取得するのに最適な場所ではなく、論理的に正しく動作していると思います。

 
Alexey Viktorov:
これがその答えです。

ありがとうございます。

起動時にすぐに履歴の計算をするようにしてほしい。そのように必要だから、イナイレでやっているんです。

initで、計算の前にポーズを入れました。 その場合、やはり落とし穴があるのでしょうか?

 
Andrey Sokolov:

起動時に履歴の計算をする必要があります。そのように必要なので、インサイトでやっています。

イナイトで、計算前のポーズを追加しました。 そうすると、やはり落とし穴があるのでしょうか?

最初の開始フラグをOnTick()に入れる方が簡単で信頼性が高い

 
jarikn:
昨日のインジケータでEAをスケッチしたのですが、何かうまく動きません。シグナルに基づかない取引を行うようです。反対側のシグナルでクローズオーダーを追加しようとしましたが、取引がクローズされた後、クローズされません。懐かしいと思います。
ほとんどの場合、インジケータが描画する...そして、ログでエラーを検索する
 
Andrey Sokolov:

どんな理由で?何が問題なのか書かないのはなぜ?

開発者がOnInit()は初期化用であり、それ以外の用途には使えないと書いているため

OnInit()でインジケータの値を取得するために一時停止をしましたが、ユーザーが同時にTFを切り替えたらどうなりますか?

SZZY: また、EAを実行した後、ターミナルを閉じて、実行中のEAでターミナルを再び開いた場合、コードはどのように動作しますか?