エラー、バグ、質問 - ページ 585

 
ウィザードEAとは別にトレーディングシグナルモジュールを 使用することはできますか?テストのために、私は次のように書きました。


#include <Expert\Signal\SignalMA.mqh>


CSignalMA  SignalMA;
int        TickCount;
string     Str;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   TickCount=0;
 
   SignalMA.Symbol(Symbol());
   SignalMA.Period(PERIOD_H1);
   SignalMA.Weight(0.5);
 
   SignalMA.PeriodMA(20);
   SignalMA.Shift(0);
   SignalMA.Method(MODE_SMA);
   SignalMA.Applied(PRICE_CLOSE);

 
   return(0);
 
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
 
   TickCount++;
   Str = "LongCondition  = " + IntegerToString(SignalMA.LongCondition())+"; "+IntegerToString(TickCount)+ "\n";
   Str = Str + "ShortCondition = " + IntegerToString(SignalMA.ShortCondition())+"; "+IntegerToString(TickCount);
   Comment(Str);
 
  }
//+------------------------------------------------------------------+

しかし、太字で表示されているものはCSignalMAクラスではありませんが、コンパイルはうまくいき、シンボルに配置しようとすると、次のようなメッセージが表示されます。


2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Period: タイムフレームの変更が禁止されています。
2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Symbol: シンボルの変更が禁止されています。

標準の取引シグナルのシンボルとタイムフレームを変更するにはどうすればよいですか?
Использование прямого и обратного преобразований Фишера для анализа рынков в MetaTrader 5
Использование прямого и обратного преобразований Фишера для анализа рынков в MetaTrader 5
  • 2011.08.16
  • investeo
  • www.mql5.com
Функция распределения рыночных данных не является гауссовой, скорее она похожа на распределение синусоподобной волны. Поскольку большинство индикаторов базируются на предположении о нормальном распределении цен, их нужно "скорректировать". Решением является использование преобразования Фишера, которое преобразует данные таким образом, чтобы они имели распределение, близкое к нормальному. В статье рассмотрена теория прямого и обратного преобразования Фишера и ее применение в трейдинге, разработан модуль торговых сигналов.
 
Konstantin83:
ウィザードEAとは別にトレーディングシグナルモジュールを 使用することはできますか?テストのために、私は次のように書きました。


#include <Expert\Signal\SignalMA.mqh>


CSignalMA  SignalMA;
int        TickCount;
string     Str;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   TickCount=0;
 
   SignalMA.Symbol(Symbol());
   SignalMA.Period(PERIOD_H1);
   SignalMA.Weight(0.5);
 
   SignalMA.PeriodMA(20);
   SignalMA.Shift(0);
   SignalMA.Method(MODE_SMA);
   SignalMA.Applied(PRICE_CLOSE);

 
   return(0);
 
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
 
   TickCount++;
   Str = "LongCondition  = " + IntegerToString(SignalMA.LongCondition())+"; "+IntegerToString(TickCount)+ "\n";
   Str = Str + "ShortCondition = " + IntegerToString(SignalMA.ShortCondition())+"; "+IntegerToString(TickCount);
   Comment(Str);
 
  }
//+------------------------------------------------------------------+

しかし、太字で表示されているものはCSignalMAクラスではありませんが、コンパイルはうまくいき、シンボルに配置しようとすると、次のようなメッセージが表示されます。


2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Period: タイムフレームの変更が禁止されています。
2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Symbol: シンボルの変更が禁止されています。

標準の売買シグナルのシンボルやタイムフレームを変更するにはどうすればよいですか?
基本的には可能です。しかし、売買シグナルモジュールの初期化は、まったく「儀式」のようなものです。残念ながら、初期化手順のすべてを「指で」説明することはできません。
 

以下のコードです。

RectLabel* GetLabel()
{
   static bool initialized = false;
   static RectLabel label("rectlabel sample", 0, 0);
   
   if (!initialized)
   {
      Pos leftTop = {100, 100};
      Rect rect(leftTop, 100, 50);
      
      label.Move(rect);
      label.SetBGColor(clrYellowGreen);
      label.SetTooltip(" -- Yuuuu! -- ");
      
      initialized = true;
   }

   return GetPointer(label);
}

関数が 呼び出されるたびに、label のコンストラクタを呼び出します。

Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Основы языка / Функции / Вызов функции - Документация по MQL5
 

以下のコードで、最初の場合はインジケーターがセットされ、2番目の場合はセットされません(スラッシュで切り替え)。

#include <Charts\Chart.mqh>
CChart cc;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   int f_h=iFractals(_Symbol,_Period);
   
   if (f_h==INVALID_HANDLE) {Print("Ошибка создания индикатора.");return(-1);}
   
   ChartIndicatorAdd(0,0,f_h);   // устанавливает индикатор
   
   //cc.IndicatorAdd(0,f_h);     // НЕ устанавливает индикатор
   
   if(GetLastError()>0) {Print("Ошибка  (",GetLastError(),") ");} ResetLastError();
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
 { }
 

このライブラリの2番目のオプションは0を出力します。他の機能はすべて動作するようです。

#include <Trade\SymbolInfo.mqh>
CSymbolInfo si;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   Print (SymbolInfoDouble("EURUSD",SYMBOL_BID)); // все правильно
   
   si.Name("EURUSD");
   Print (si.Bid());            // выводит 0
   
   if(GetLastError()>0) {Print("Ошибка  (",GetLastError(),") ");} ResetLastError();
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
 { 
 }
 
Karlson:

次のコードについて、1番目の場合はインジケータがセットされ、2番目の場合はセットされません(スラッシュで切り替わります)。

私が理解する限り、現時点では3つのパラメータはすべて必須です。

したがって、ウィンドウ番号を指定する必要があります (バリエーション: 0 - メイン・ウィンドウ、ChartIndicatorsTotal() - 新規ウィンドウ、0 ~ChartIndicatorsTotal() - 1- 既存ウィンドウ)。

エラーが出ないものは良くない。

カールソン

このライブラリの場合、2番目のオプションは0を出力します。

価格を取得する前に、リフレッシュ(少なくともRefreshRates)を使用する必要がある場合がほとんどです。

正しいバリアントは次のようになります。

  si.Name("EURUSD");
  si.Refresh();
  si.RefreshRates();
  Print(si.Bid());
 

ありがとうございます。 Bidで、refreshを指定すると本当に動きました。

しかし、ライブラリを使ったインジケータ出力では、サブウィンドウとハンドルの2つのパラメータが必要です。 それ以外はパラメータの数が間違っていると言われます。ライブラリは同じChartIndicatorAddを使って いるので、それが分かりません。

Документация по MQL5: Операции с графиками / ChartIndicatorAdd
Документация по MQL5: Операции с графиками / ChartIndicatorAdd
  • www.mql5.com
Операции с графиками / ChartIndicatorAdd - Документация по MQL5
 
Karlson:

ありがとうございます。 Bidで、refreshを指定すると本当に動きました。

しかし、ライブラリを使ったインジケータ出力では、サブウィンドウとハンドルの2つのパラメータが必要です。 それ以外はパラメータの数が間違っていると言われます。 ライブラリは同じChartIndicatorAddを使って いるので直接動作しますが、ライブラリ呼び出しは動作しないので、解りません。

このライブラリを使用するには、2つのパラメータが必要です。チャートとサブウインドウ
 
uncleVic:
このライブラリを使用するには、2つのパラメータが必要です。チャートとサブウインドウ

ハンドルなし?また、どのターンテーブルを使うかは、システムがどのように判断するのでしょうか? ...これまでは、書かれていることを信じていました :)基板とハンドルです。

 
Karlson:

ハンドルなし?どのインジケーターを使うかは、システムがどのように判断するのでしょうか? 今までのテキストを信頼しています :)サブウインドウとハンドル。

図書館について(クラスヘルプより)

インジケーターアッド

指定されたハンドルを持つインジケータを、指定されたチャートウィンドウに追加します。

bool  IndicatorAdd(
   int   sub_win         // номер подокна
   int   handle          // хэндл индикатора
   );

ChartIndicatorAddの 直作品について。

ChartIndicatorAdd

指定されたハンドルを持つインジケータを、指定されたチャートウィンドウに追加します。

bool  ChartIndicatorAdd(
   long  chart_id,                 // идентификатор графика
   int   sub_window                // номер подокна
   int   indicator_handle          // хэндл индикатора
   );

CChart クラスについては。

不必要な質問を避けるために、3つの基本ルールを守るようにしています。

1.ソースコードを見て、不明な点があればドキュメントを参照します(ソースコードは常に「真実」を語ってくれますが、ドキュメントは嘘をつくこともあります)。

2.OOPの実装を重視する場合は、特定のクラスの記述から始まり、「直接実装者」まで踏み込みます。実作業」が重要であれば、OOPは最後に勉強すべきです(コードの下調べ/上調べ)。

3.ドキュメントやソースを読んでもわからないことがあれば、フォーラムに行く。

クラス内のIndicatorAddメソッドの実装を直接確認する

ソースコードを見ると、メソッドはサブウィンドウとハンドルを取得し(ヘルプに記載)、3番目のパラメータはクラス自体に格納されているデータ(グラフIDのことです)から取得されていることがわかります。

class CChart : public CObject
  {
protected:
   long  m_chart_id; // chart identifier
public:
   //methods for working with indicators
   bool  IndicatorAdd(int subwin,int handle);
  }

bool CChart::IndicatorAdd(int subwin,int handle)
  {
//checking (проверка корректности идентификатора графика)
   if(m_chart_id<=0) return(false);
//Непосредственно в обработку выдаются три параметра
   return(ChartIndicatorAdd(m_chart_id,subwin,handle));
  }