初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 1213

 
Andrey.Sabitov:

親愛なる専門家の皆さん、こんにちは。

前のポジションを閉じた売りと同じバーで買いポジションを開くことを妨げるエラーがコードのどこにあるか教えていただけませんか?

ルールは簡単です(覚えるのは)。
1 エントリー - 遅い指標が0を越える+速い指標もゾーンに入る(買い/売り)

2 出口-クイックインジケータによる交差点 0

私はあなたのコードを理解しようとしています - 私はちょうど今それを実行している、それのすべてではない、あなたがレイアウトされた

撮影者

あなたのコード、そして私の考え.

Реверс добавил и Индикатор в положенное место переставил 
//+------------------------------------------------------------------+
//|                                                      TestDPO.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#include <Trade\Trade.mqh>
CTrade trade;
//---
input int    dpo_fast_period = 9;     // DPO Fast Period
input int    dpo_slow_period = 40;    // DPO Fast Period
input int    Inpmagic        = 1000;  // Magic советника
input ulong  slippage        = 10;    // Проскальзывание цены
input double Inpvolume       = 0.01;  // размер позиции
input bool   Revers          = false; // Revers
//---
double fDPOVal[];    // Динамический массив для хранения значений fast DPO
double sDPOVal[];    // Динамический массив для хранения значений slow DPO
int    DPO_fast = 0; // Хэндл для быстрого DPO
int    DPO_slow = 0; // Хэндл для медленного DPO
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- prepare trade class to control positions if hedging mode is active
   trade.SetExpertMagicNumber(Inpmagic);
   trade.SetMarginMode();
   trade.SetTypeFillingBySymbol(Symbol());
//--- DPO indicator
   DPO_fast=iCustom(NULL,0,"Examples\\DPO",dpo_fast_period);
   if(DPO_fast==INVALID_HANDLE)
     {
      printf("Error creating MA indicator");
      return(INIT_FAILED);
     }
//--- DPO indicator
   DPO_slow=iCustom(NULL,0,"Examples\\DPO",dpo_slow_period);
   if(DPO_slow==INVALID_HANDLE)
     {
      printf("Error creating MA indicator");
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
//---------------Задаем цены покупки и продажи------------------------
   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   int signal=0;  // сигнал на покупку, продажу

//--------------Проверка на новый бар
   if(!isNewBar())
      return;
//--------------------------------------------------------------------
   ArraySetAsSeries(fDPOVal,true);              // задаем направление индексов массива
   ArraySetAsSeries(sDPOVal,true);
   if(CopyBuffer(DPO_fast,0,0,10,fDPOVal)<0)    // наполняем массив значений DPO fast
     {
      Alert("Ошибка копирования буфера индикатора fast DPO. Ошибка ", GetLastError());
     }
   if(CopyBuffer(DPO_slow,0,0,10,sDPOVal)<0)    // наполняем массив значений DPO slow
     {
      Alert("Ошибка копирования буфера индикатора slow DPO. Ошибка ", GetLastError());
     }

   double DPO_fast_c_value=NormalizeDouble(fDPOVal[1],6);  // запоминаем значение индикатора DPO fast на предыдущем баре
   double DPO_slow_c_value=NormalizeDouble(sDPOVal[1],6);  // запоминаем значение индикатора DPO slow на предыдущем баре
   double DPO_fast_p_value=NormalizeDouble(fDPOVal[2],6);  // запоминаем значение индикатора DPO fast на пред-предыдущем баре
   double DPO_slow_p_value=NormalizeDouble(sDPOVal[2],6);  // запоминаем значение индикатора DPO slow на пред-предыдущем баре

   if(DPO_slow_c_value>0 && DPO_slow_p_value<0 && DPO_fast_c_value>0)  // если медленный индикатор пересекает 0 снизу вверх и быстрый находится выше 0
      signal=1;                                                        // сигнал на открытие покупки
   if(DPO_slow_c_value<0 && DPO_slow_p_value>0 && DPO_fast_c_value<0)  // если медленный индикатор пересекает 0 сверху вниз и быстрый находится ниже 0
      signal=-1;                                                       // сигнал на открытие продажи
   if(DPO_fast_c_value>0 && DPO_fast_p_value<0)                        // если быстрый индикатор пересекает 0 снизу вверх
      signal=-2;                                                       // сигнал на закрытие продажи
   if(DPO_fast_c_value<0 && DPO_fast_p_value>0)                        // если быстрый индикатор пересекает 0 сверху вниз
      signal=2;                                                        // сигнал на закрытие покупки
   if(!Revers)
     {
      switch(signal)
        {
         case -1:
            trade.Buy(Inpvolume,NULL,Ask,0,0,NULL);
            break;
         case 1:
            trade.Sell(Inpvolume,NULL,Bid,0,0,NULL);
            break;
         case -2:
            trade.PositionClose(_Symbol,slippage);
            break;
         case 2:
            trade.PositionClose(_Symbol,slippage);
            break;
        }
     }
   if(Revers)
     {
      switch(signal)
        {
         case -1:
            trade.Sell(Inpvolume,NULL,Bid,0,0,NULL);
            break;
         case 1:
            trade.Buy(Inpvolume,NULL,Ask,0,0,NULL);
            break;
         case -2:
            trade.PositionClose(_Symbol,slippage);
            break;
         case 2:
            trade.PositionClose(_Symbol,slippage);
            break;
        }
     }
  }
//+------------------------------------------------------------------+
//| Возвращает true, если появился новый бар для пары символ/период  |
//+------------------------------------------------------------------+
bool isNewBar()
  {
//--- в статической переменной будем помнить время открытия последнего бара
   static datetime last_time=0;
//--- текущее время
   datetime lastbar_time=(int)SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);

//--- если это первый вызов функции
   if(last_time==0)
     {
      //--- установим время и выйдем
      last_time=lastbar_time;
      return(false);
     }

//--- если время отличается
   if(last_time!=lastbar_time)
     {
      //--- запомним время и вернем true
      last_time=lastbar_time;
      return(true);
     }
//--- дошли до этого места - значит бар не новый, вернем false
   return(false);
  }
//+------------------------------------------------------------------+
 

回答してくださった方、ありがとうございました。

しかし、注文がクローズされ、同じバーでシグナルがあった場合、ポジションがオープンされないという問題が残ります。

これはどういうことなのか、どうすれば直るのか、教えていただけませんか?


 
Andrey.Sabitov:

回答してくださった方、ありがとうございました。

しかし、注文がクローズされ、同じバーでシグナルがあった場合、ポジションがオープンされないという問題が残ります。

これはどういうことなのか、どうすれば直るのか、教えていただけませんか?


ぱっと見て、新しいバーが あるかどうかを確認するのです。

//--------------Проверка на новый бар
   if(!isNewBar())
      return;

という信号を探すだけです。すでにこのバーに乗ったことがある人は当たらないことが判明しました。

 

こんな感じかな?

//+------------------------------------------------------------------+
//|                                                      TestDPO.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//---
#include <Trade\Trade.mqh>
CTrade trade;
//---
input int    dpo_fast_period = 9;     // DPO Fast Period
input int    dpo_slow_period = 40;    // DPO Fast Period
input int    Inpmagic        = 1000;  // Magic советника
input ulong  slippage        = 10;    // Проскальзывание цены
input double Inpvolume       = 0.01;  // размер позиции
input bool   Revers          = false; // Revers
//---
double fDPOVal[];    // Динамический массив для хранения значений fast DPO
double sDPOVal[];    // Динамический массив для хранения значений slow DPO
int    DPO_fast = 0; // Хэндл для быстрого DPO
int    DPO_slow = 0; // Хэндл для медленного DPO
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- prepare trade class to control positions if hedging mode is active
   trade.SetExpertMagicNumber(Inpmagic);
   trade.SetMarginMode();
   trade.SetTypeFillingBySymbol(Symbol());
//--- DPO indicator
   DPO_fast=iCustom(NULL,0,"Examples\\DPO",dpo_fast_period);
   if(DPO_fast==INVALID_HANDLE)
     {
      printf("Error creating MA indicator");
      return(INIT_FAILED);
     }
//--- DPO indicator
   DPO_slow=iCustom(NULL,0,"Examples\\DPO",dpo_slow_period);
   if(DPO_slow==INVALID_HANDLE)
     {
      printf("Error creating MA indicator");
      return(INIT_FAILED);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
//---------------Задаем цены покупки и продажи------------------------
   double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits);

   int signal=0;  // сигнал на покупку, продажу

//*******************************************************************
// эта часть программы выполняется каждый тик
//-if(!isNewBar(PERIOD_M1))
   Print("Новый бар M1 ",  TimeCurrent());
//-if(!isNewBar(PERIOD_M5))
   Print("Новый бар M5 ",  TimeCurrent());
//-if(!isNewBar(PERIOD_CURRENT))
   Print("Новый бар M15",  TimeCurrent());
//*******************************************************************
//--------------Проверка на новый бар
   if(!isNewBar(PERIOD_CURRENT))
      return;
//--------------------------------------------------------------------
   ArraySetAsSeries(fDPOVal,true);              // задаем направление индексов массива
   ArraySetAsSeries(sDPOVal,true);
   if(CopyBuffer(DPO_fast,0,0,10,fDPOVal)<0)    // наполняем массив значений DPO fast
     {
      Alert("Ошибка копирования буфера индикатора fast DPO. Ошибка ", GetLastError());
     }
   if(CopyBuffer(DPO_slow,0,0,10,sDPOVal)<0)    // наполняем массив значений DPO slow
     {
      Alert("Ошибка копирования буфера индикатора slow DPO. Ошибка ", GetLastError());
     }

   double DPO_fast_c_value=NormalizeDouble(fDPOVal[1],6);  // запоминаем значение индикатора DPO fast на предыдущем баре
   double DPO_slow_c_value=NormalizeDouble(sDPOVal[1],6);  // запоминаем значение индикатора DPO slow на предыдущем баре
   double DPO_fast_p_value=NormalizeDouble(fDPOVal[2],6);  // запоминаем значение индикатора DPO fast на пред-предыдущем баре
   double DPO_slow_p_value=NormalizeDouble(sDPOVal[2],6);  // запоминаем значение индикатора DPO slow на пред-предыдущем баре

   if(DPO_slow_c_value>0 && DPO_slow_p_value<0 && DPO_fast_c_value>0)  // если медленный индикатор пересекает 0 снизу вверх и быстрый находится выше 0
      signal=1;                                                        // сигнал на открытие покупки
   if(DPO_slow_c_value<0 && DPO_slow_p_value>0 && DPO_fast_c_value<0)  // если медленный индикатор пересекает 0 сверху вниз и быстрый находится ниже 0
      signal=-1;                                                       // сигнал на открытие продажи
   if(DPO_fast_c_value>0 && DPO_fast_p_value<0)                        // если быстрый индикатор пересекает 0 снизу вверх
      signal=-2;                                                       // сигнал на закрытие продажи
   if(DPO_fast_c_value<0 && DPO_fast_p_value>0)                        // если быстрый индикатор пересекает 0 сверху вниз
      signal=2;                                                        // сигнал на закрытие покупки
   if(!Revers)
     {
      switch(signal)
        {
         case -1:
            trade.Buy(Inpvolume,NULL,Ask,0,0,NULL);
            break;
         case 1:
            trade.Sell(Inpvolume,NULL,Bid,0,0,NULL);
            break;
         case -2:
            trade.PositionClose(_Symbol,slippage);
            break;
         case 2:
            trade.PositionClose(_Symbol,slippage);
            break;
        }
     }
   if(Revers)
     {
      switch(signal)
        {
         case -1:
            trade.Sell(Inpvolume,NULL,Bid,0,0,NULL);
            break;
         case 1:
            trade.Buy(Inpvolume,NULL,Ask,0,0,NULL);
            break;
         case -2:
            trade.PositionClose(_Symbol,slippage);
            break;
         case 2:
            trade.PositionClose(_Symbol,slippage);
            break;
        }
     }
  }
/*
//+------------------------------------------------------------------+
//| Возвращает true, если появился новый бар для пары символ/период  |
//+------------------------------------------------------------------+
bool isNewBar()
  {
//--- в статической переменной будем помнить время открытия последнего бара
   static datetime last_time=0;
//--- текущее время
   datetime lastbar_time=(int)SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE);

//--- если это первый вызов функции
   if(last_time==0)
     {
      //--- установим время и выйдем
      last_time=lastbar_time;
      return(false);
     }

//--- если время отличается
   if(last_time!=lastbar_time)
     {
      //--- запомним время и вернем true
      last_time=lastbar_time;
      return(true);
     }
//--- дошли до этого места - значит бар не новый, вернем false
   return(false);
  }
*/
//+------------------------------------------------------------------+
//| возвращает true если появился новый бар, иначе false             |
//+------------------------------------------------------------------+
bool isNewBar(ENUM_TIMEFRAMES timeFrame)
  {
//----
   static datetime old_Times[21];// массив для хранения старых значений
   bool res=false;               // переменная результата анализа
   int  i=0;                     // номер ячейки массива old_Times[]
   datetime new_Time[1];         // время нового бара

   switch(timeFrame)
     {
      case PERIOD_M1:
         i= 0;
         break;
      case PERIOD_M2:
         i= 1;
         break;
      case PERIOD_M3:
         i= 2;
         break;
      case PERIOD_M4:
         i= 3;
         break;
      case PERIOD_M5:
         i= 4;
         break;
      case PERIOD_M6:
         i= 5;
         break;
      case PERIOD_M10:
         i= 6;
         break;
      case PERIOD_M12:
         i= 7;
         break;
      case PERIOD_M15:
         i= 8;
         break;
      case PERIOD_M20:
         i= 9;
         break;
      case PERIOD_M30:
         i=10;
         break;
      case PERIOD_H1:
         i=11;
         break;
      case PERIOD_H2:
         i=12;
         break;
      case PERIOD_H3:
         i=13;
         break;
      case PERIOD_H4:
         i=14;
         break;
      case PERIOD_H6:
         i=15;
         break;
      case PERIOD_H8:
         i=16;
         break;
      case PERIOD_H12:
         i=17;
         break;
      case PERIOD_D1:
         i=18;
         break;
      case PERIOD_W1:
         i=19;
         break;
      case PERIOD_MN1:
         i=20;
         break;
     }
// скопируем время последнего бара в ячейку new_Time[0]
   int copied=CopyTime(_Symbol,timeFrame,0,1,new_Time);

   if(copied>0) // все ок. данные скопированы
     {
      if(old_Times[i]!=new_Time[0])       // если старое время бара не равно новому
        {
         if(old_Times[i]!=0)
            res=true;    // если это не первый запуск, то истина = новый бар
         old_Times[i]=new_Time[0];        // запоминаем время бара
        }
     }
//----
   return(res);
  }
//+------------------------------------------------------------------+
 
Alexsandr San:

こんな感じかな?

ここで数字を変えると

   double DPO_fast_c_value=NormalizeDouble(fDPOVal[1],6);  // запоминаем значение индикатора DPO fast на предыдущем баре
   double DPO_slow_c_value=NormalizeDouble(sDPOVal[0],6);  // запоминаем значение индикатора DPO slow на предыдущем баре
   double DPO_fast_p_value=NormalizeDouble(fDPOVal[0],6);  // запоминаем значение индикатора DPO fast на пред-предыдущем баре
   double DPO_slow_p_value=NormalizeDouble(sDPOVal[1],6);  // запоминаем значение индикатора DPO slow на пред-предыдущем баре

よりきれいになりました。

撮影者

 

ごあいさつ

以下のようにアドバイスしてください。OnTester関数は、2つのパラメータを計算します。1つのパラメータで最適化する場合、2つ目のパラメータは単純に最適化テーブルに出力される可能性はありますか?また、Yesの場合はどうすればいいのか?ありがとうございました。

 
皆さんこんにちは!!mt5で気配値履歴を読み込むことが可能かどうか教えてください。2日前から情報を探しているが、わからない。
 
Igorz2006:
皆さんこんにちは!教えてください!mt5で気配値履歴を読み込むことは可能ですか?私2日間、情報を探してきたが、それを 把握することはできません。

機能です。

コピー率

指定されたシンボルと期間のレート構造体の ヒストリデータを配列で取得する。

コピータイム

指定されたシンボルと期間のバーの開始時刻の履歴データを配列で取得します。

CopyOpen

指定されたシンボルと期間のバーの始値に関する履歴データを配列で取得する

コピーハイ

指定されたシンボルと期間の最大バー価格のヒストリデータを配列で取得する

コピーロー

指定されたシンボルと期間の最小バー価格のヒストリデータを配列で取得する

コピークローズ

指定されたシンボルと期間のバークローズ価格の履歴データを配列で取得する

CopyTickVolume

指定したシンボルと期間のティックボリュームのヒストリデータを配列で取得する

CopyRealVolume

指定されたシンボルと期間の取引量の履歴データを配列で取得する

CopySpread

指定したシンボルと期間のスプレッドの履歴データを配列で取得する

コピーチケット

ティックの履歴データをMqlTick形式で配列に取得する

CopyTicksRange

指定した日付範囲の目盛りを配列で取得する

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
  • www.mql5.com
Получает в массив rates_array исторические данные структуры MqlRates указанного символа-периода в указанном количестве. Отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар. При копировании заранее неизвестного количества данных рекомендуется в качестве приемного...
 
Igorz2006:
mt5で気配値履歴を読み込むことは可能でしょうか?2 日前から情報を探しているのですが、見つからないのです。

4のようなHistoryCenterのようなものはなく、PgUpを押すだけです。

 
ありがとうございます、試してみます。ビットコインや暗号の相場履歴をインポートして 分析する必要がある
理由: