Fehler, Irrtümer, Fragen - Seite 585

 
Kann ich Handelssignalmodule getrennt von Wizard EAs verwenden? Zu Testzwecken habe ich geschrieben


#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);
 
  }
//+------------------------------------------------------------------+

Aber was in Fettdruck gezeigt wird, ist nicht in CSignalMA Klasse, aber es kompiliert gut, wenn ich versuche, es auf das Symbol zu platzieren gibt es aus


2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Period: Wechsel des Zeitrahmens ist untersagt
2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Symbol: Ändern des Symbols ist untersagt

Wie ändere ich Symbol und Zeitrahmen für Standard-Handelssignale?
Использование прямого и обратного преобразований Фишера для анализа рынков в MetaTrader 5
Использование прямого и обратного преобразований Фишера для анализа рынков в MetaTrader 5
  • 2011.08.16
  • investeo
  • www.mql5.com
Функция распределения рыночных данных не является гауссовой, скорее она похожа на распределение синусоподобной волны. Поскольку большинство индикаторов базируются на предположении о нормальном распределении цен, их нужно "скорректировать". Решением является использование преобразования Фишера, которое преобразует данные таким образом, чтобы они имели распределение, близкое к нормальному. В статье рассмотрена теория прямого и обратного преобразования Фишера и ее применение в трейдинге, разработан модуль торговых сигналов.
 
Konstantin83:
Kann ich Handelssignalmodule getrennt von Wizard EAs verwenden? Zu Testzwecken habe ich geschrieben


#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);
 
  }
//+------------------------------------------------------------------+

Aber was in Fettdruck gezeigt wird, ist nicht in CSignalMA Klasse, aber es kompiliert gut, wenn ich versuche, es auf das Symbol zu platzieren gibt es aus


2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Period: Wechsel des Zeitrahmens ist untersagt
2011.11.29 15:36:27 1234 (EURUSD,M1) CExpertBase::Symbol: Ändern des Symbols ist untersagt

Wie kann ich das Symbol und den Zeitrahmen für die Standard-Handelssignale ändern?
Im Grunde können Sie das. Aber die Initialisierung des Moduls für Handelssignale ist ein ganzes "Ritual". Ich fürchte, ich kann die gesamte Initialisierungsprozedur nicht "aus dem Stegreif" erklären.
 

Der folgende Code:

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);
}

Ruft bei jedem Funktionsaufruf den Konstruktor für label auf.

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

Mit folgendem Code: im ersten Fall ist das Kennzeichen gesetzt, im zweiten Fall nicht (mit Schrägstrichen geschaltet).

#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()
 { }
 

Die zweite Option in dieser Bibliothek gibt 0 aus. Alle anderen Funktionen scheinen zu funktionieren.

#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:

Für den nächsten Code: im ersten Fall ist das Kennzeichen gesetzt, im zweiten Fall nicht (mit Schrägstrichen umgeschaltet).

Soweit ich weiß, sind derzeit alle drei Parameter obligatorisch.

Daher müssen Sie die Fensternummer angeben (Varianten: 0 - Hauptfenster, ChartIndicatorsTotal() - neues Fenster, 0 bisChartIndicatorsTotal()-1 - ein bestehendes Fenster).

Das ist, was nicht gibt, Fehler ist nicht gut.

Karlson:

Bei dieser Bibliothek wird für die zweite Option 0 ausgegeben. Alle anderen Funktionen scheinen zu funktionieren.

Wahrscheinlich sollte vor dem Erhalt der Preis Refresh verwendet werden (zumindest RefreshRates).

Die richtige Variante sollte wie folgt aussehen

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

Danke, mit Bid hat es wirklich funktioniert, nachdem ich Refresh angegeben habe.

Aber der Indikator-Ausgang, mit der Bibliothek, erfordert 2 Parameter, ein Unterfenster und ein Handle. Ansonsten sagt es, die Anzahl der Parameter ist falsch, ich kann es nicht herausfinden, weil die Bibliothek die gleiche ChartIndicatorAdd verwendet.

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

Danke, mit Bid hat es wirklich funktioniert, nachdem ich Refresh angegeben habe.

Aber der Indikator-Ausgang, mit der Bibliothek, erfordert 2 Parameter, ein Unterfenster und ein Handle. Ansonsten sagt es, die Anzahl der Parameter ist falsch, ich kann es nicht herausfinden, weil die Bibliothek die gleiche ChartIndicatorAdd verwendet.

Die Verwendung der Bibliothek erfordert 2 Parameter. Diagramm und Unterfenster.
 
uncleVic:
Die Verwendung der Bibliothek erfordert 2 Parameter. Diagramm und Unterfenster.

Ohne Handgriff? Und woher weiß das System, welchen Plattenspieler es verwenden soll? Bisher habe ich dem Geschriebenen vertraut :) Das Substrat und der Griff.

 
Karlson:

Ohne Griff? Woher weiß das System, welcher Indikator zu verwenden ist? Ich habe den Texten bisher vertraut :) Unterfenster und Griff.

Über die Bibliothek (aus der Klassenhilfe)

IndikatorAdd

Fügt einen Indikator mit dem angegebenen Handle in das angegebene Chartfenster ein.

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

Bezüglich der direkten Arbeit von ChartIndicatorAdd.

ChartIndicatorAdd

Fügt einen Indikator mit dem angegebenen Handle in das angegebene Chartfenster ein.

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

Was die Klasse CChart betrifft.

Um unnötige Fragen zu vermeiden, versuchen wir, drei Grundregeln zu befolgen:

1. Wir schauen uns den Quellcode an, und wenn etwas nicht klar ist, schauen wir in die Dokumentation (der Quellcode wird immer die "Wahrheit" sagen, aber die Dokumentation kann auch lügen);

2. Wenn die OOP-Implementierung für uns wichtig ist, gehen wir von der Beschreibung einer bestimmten Klasse aus und gehen bis zu den "direkten Implementierern". Wenn "echte Arbeit" wichtig ist, sollte OOP zuletzt studiert werden (Abwärts-/Aufwärtsprüfung des Codes);

3. Wenn nach dem Lesen der Dokumentation und der Quellen etwas nicht klar ist, wenden Sie sich an das Forum.

Direkt auf die Implementierung der Methode IndicatorAdd in einer Klasse

Wenn Sie sich den Quellcode ansehen, wird deutlich, dass die Methode Subwindow und Handle erhält (wie in der Hilfe angegeben), und der dritte Parameter wird aus den in der Klasse selbst gespeicherten Daten entnommen (ich meine die Graph-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));
  }