Fehler, Irrtümer, Fragen - Seite 2470

 
Igor Zakharov:

Es geht also nicht um Sekunden...

Darum sollte es in der Sprachbeschreibung in erster Linie gehen.

Nicht in Artikeln, nach denen man suchen muss. Das Letzte, wonach Sie im Forum suchen sollten, ist dies.

Sonst stellt sich heraus: Ich schaue in ein Buch, aber ich sehe eine Figur...

 

Warum sollte dies der Fall sein?

IM      0       17:19:04.403    Terminal        MetaTrader 5 x64 build 2056 started (MetaQuotes Software Corp.)
NG      0       17:19:04.403    Terminal        Windows 7 Service Pack 1 (build 7601) x64, IE 11, AMD FX-4170 Quad-Core Processor , Memory: 9408 / 12255 Mb, Disk: 20 / 238 Gb, GMT+3

Ich habe heute herausgefunden, dass das Mindestvolumen in der Werkzeugspezifikation 100 beträgt und der Schritt ebenfalls 100 ist. Es öffnet jedoch keine Positionen mit dem Fehler"Ungültiges Volumen". Wenn ich 0,01 einstelle, sind die Schaltflächen inaktiv.

Ersetzte die Version durch eine "jüngere" Version.

KK      0       17:35:14.046    Terminal        MetaTrader 5 x64 build 2025 started (MetaQuotes Software Corp.)
IE      0       17:35:14.046    Terminal        Windows 7 Service Pack 1 (build 7601) x64, IE 11, AMD FX-4170 Quad-Core Processor , Memory: 9182 / 12255 Mb, Disk: 20 / 238 Gb, GMT+3

keine Änderung.

Dann ersetzte ich sie durch die Release-Version.

FI      0       17:37:23.049    Terminal        MetaTrader 5 x64 build 2007 started (MetaQuotes Software Corp.)
RS      0       17:37:23.049    Terminal        Windows 7 Service Pack 1 (build 7601) x64, IE 11, AMD FX-4170 Quad-Core Processor , Memory: 9180 / 12255 Mb, Disk: 20 / 238 Gb, GMT+3

Und hier ist das Ergebnis.



Warum trifft es nur ein Unternehmen? Wäre sie weit verbreitet, wäre das Problem schon längst gelöst worden.

In welche Richtung sollte ich die Unterstützung des Unternehmens schicken?


Hinzugefügt: Es ist sehr seltsam, dass Build 2025 auf einem Cent-Konto desselben Unternehmens problemlos funktioniert. Alle Werkzeugparameter sind so, wie sie sein sollten.

Sie können auf Cent handeln. Ich habe es selbst herausgefunden... ...aber ich will mehr.

 
Ilyas:

Vielen Dank für Ihre Nachricht.
Das ist nur rudimentär, das kriegen wir schon hin.

@Ilyas, es gibt ein ähnliches Problem mit NonPOD struct.

struct NonPod{
   uchar data[];
};   
   
void OnStart(){
   NonPod obj;
   
   obj = (NonPod)(obj);   // '(' - invalid cast operation	
}
 
Weiß jemand, wie man diese Einschränkung umgehen kann, abgesehen vom Warten auf ein neues Build mit Namespace-Unterstützung für Klassen?
template<typename T>
class TestTypedef{
public:
   typedef void (* callback)(T &);    // 'callback' - identifier already used
   callback eq;
};


void ff(int&) {Print(__FUNCSIG__);}

void OnStart(){  

   TestTypedef<int> int_value;
   int_value.eq = ff;
   
   int x = 5;
   int_value.eq(x);                 // Ok

   TestTypedef<string> int_value;   //Compile error 'callback' - identifier already used
}

Problem im Bereich der Deklaration des globalen Namensraumes innerhalb dertypedef-Funktionalität

 
MT5 (Build 2057)

Kompilierungsfehler bei wiederholter Verwendung der gleichen Funktionssignatur innerhalb von typedef:
typedef void (* callback_0)();     // а без этой строки все ОК
typedef void (* callback)();

void test_func(){}

void OnStart(){
   callback func_ptr = test_func;  //'test_func' - type mismatch
   func_ptr();
}
 
Sergey Dzyublik:
MT5 (Build 2057)

Fehler mit "Verbot" der Wiederverwendung der gleichen Signatur innerhalb eines Typedefs:

Und ich habeein im Wesentlichen ähnlichesSkript von vor über 2 Jahren, das ein 2056x32-Ergebnis liefert: EX5 loading failed

 
Sergey Dzyublik:
Weiß jemand, wie man diese Einschränkung umgehen kann, abgesehen vom Warten auf ein neues Build mit Namespace-Unterstützung für Klassen?

Kompilieren

void f(int&) {}
void OnStart()
{
   TestTypedef<int> int_value;
   TestTypedef<string> string_value;

es ist möglich (und wird sogar funktionieren), aber nicht mehr als das: dann, sagen wir, können Sie nicht schreiben

   int_value.eq = f;
}

also schreiben Sie nicht, wie

 
A100:

Kompilieren, also nicht schreiben, wie

Nein, es ist immer noch schwer, aber es funktioniert...
Der Typ bool ist im Beispiel im typedef verloren gegangen.

#define PRINT(x) ; Print(#x, ":", string(x))

#define  CREATE_TestTypedef(type)                              \
class TestTypedef_##type{                                     \
public:                                                       \
   typedef bool (* callback_##type)(type &);                  \
   callback_##type  eq;                                        \
}
   
bool f(int&) {return true;}


void OnStart(){
   CREATE_TestTypedef(int) int_value;
   CREATE_TestTypedef(string) string_value;                     
   
   int data = 5;
   int_value.eq = f;
   PRINT(int_value.eq(data));                    // result: true
}
 
Bis Typedef-Fixes und Namespace-Updates, falls vorhanden, veröffentlicht werden,
müssen wir die Verwendung jedes Typs separat über Makros deklarieren und dann Makros verwenden, um den Namen der generierten Klassen zu erhalten und ein Klassenobjekt zu erstellen...
 

Erklären Sie, warum ich beim Erstellen vonCChartObjectLabel die Objekte im Indikator nicht lösche, wenn ich in diesem Code deinitialisiere:

//+------------------------------------------------------------------+
//|                                                         test.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
#property indicator_separate_window
#include <ChartObjects\ChartObjectsTxtControls.mqh>
CChartObjectLabel *LabelUP,*LabelDN;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   CreateLabel(LabelUP,"LabelUP",0);
   CreateLabel(LabelDN,"LabelDN",30);
/*   
   LabelUP=new CChartObjectLabel;
   LabelDN=new CChartObjectLabel;
   LabelUP.Create(0,"LabelUP",ChartWindowFind(),0,0);
   LabelUP.Color(clrYellow);
   LabelUP.FontSize(14);
   LabelUP.Description("LabelUP");
   
   LabelDN.Create(0,"LabelDN",ChartWindowFind(),0,10);
   LabelDN.Color(clrYellow);
   LabelDN.FontSize(14);
   LabelDN.Description("LabelDN");
*/
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   delete LabelUP;
   delete LabelDN;
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   return(rates_total);

  }
//+------------------------------------------------------------------+
void CreateLabel(CChartObjectLabel *l,string name,int y)
  {
   l=new CChartObjectLabel;
   l.Create(0,name,ChartWindowFind(),0,y);
   l.Color(clrYellow);
   l.FontSize(14);
   l.Description(name);
  }
//+------------------------------------------------------------------+

beim TF-Wechsel erhalte ich einen Journaleintrag: 2019.05.23 09:49:02.044 tstlabel EURUSD,M30: 2 Objekte vom Typ CChartObjectLabel übrig

wenn in OnInit() die Erstellung von Textbeschriftungen (CChartObjectLabel) auskommentiert wird, dann funktioniert alles korrekt

Ich übergebe einen Zeiger an die FunktionCreateLabel(), aberich kannihn später inOnDeinit() nichtlöschen