Fragen von Anfängern MQL4 MT4 MetaTrader 4 - Seite 90

 
toni_starkDer Expert Advisor hat vor 1,5 Jahren funktioniert, jetzt ist er nicht mehr auf dem Chart zu sehen.

die These: Bewegung=Leben, Ruhe=Tod. Was steht im Protokoll? Unten rechts befinden sich zwei Registerkarten

wenn ich einen hätte, würde ich ihn überprüfen und reparieren ...

 

Forum für Handel, automatisierte Handelssysteme und Strategietests

Fragen von Anfängern MQL4 MT4 MetaTrader 4

Ilya Prozumentov, 2017.06.11 13:53

Es gibt eine Klassenvorlage für die Arbeit mit einem Array.
#property strict
#include <ObjectVariables.mqh>
#include <Arrays\varQSort.mqh>
#include <Arrays\objQSort.mqh>

template<typename T1>
class ArrayList
{
   private:
      T1 array[];
      QuickSorts<T1> *qs;
      int size;
      int index;

   public:
      //прочие функции
      void QuickSort();//отсортировать массив
      //прочие функции
};
//+------------------------------------------------------------------+
//| Сортировка массива
template<typename T1>
void ArrayList::QuickSort()
{
   int idx = index;//сохранение положения индекса
   if(IsPointer(array[0])) // true - массив содержит указатели класса
      qs /*ошибка 2*/ = new ObjQSort<T1>();
   else
      qs /*ошибка 2*/ = new VarQSort<T1>();
   qs.Sort(array, 0, index);
   index = idx;
}

Für diese Vorlagenklasse müssen wir eine Sortierung implementieren, da das Array komplexe Datentypen speichern kann. Zum Beispiel:
ArrayList<PP*> *dde; // PP - класс

Ich kann verschiedene Funktionen für einfache und komplexe Typen schreiben, aber der Compiler versteht nicht, dass Funktionen starr durch den Datentyp abgegrenzt sind und flucht weiter:
<' - unzulässige Operation ArrayList.mqh verwenden

Deshalb habe ich beschlossen, die Schnittstelle einzubetten:

#property strict
template <typename T1>
interface QuickSorts
{
   void Sort(T1 &array[], int beg, int end);
};
#property strict
#include <Arrays\QuickSorts.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T1>
class VarQSort : public /*ошибка 1*/ QuickSorts
{
private:

public:
   void Sort(T1 &array[], int beg, int end);
   VarQSort(){}
   ~VarQSort(){}
};
template <typename T1>
void VarQSort::Sort(T1 &array[], int beg,int end)
{
   //алгоритм функции
}
#property strict
#include <Arrays\QuickSorts.mqh>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T1>
class ObjQSort : public /*ошибка 1*/ QuickSorts
{
private:

public:
   void Sort(T1 &array[], int beg, int end){}
   ObjQSort(){}
   ~ObjQSort(){}
};

Alle Teile des Konstrukts sind kompilierbar. Aber wenn Sie versuchen, es zu deklarieren:
ArrayList<PP*> *dde; // PP - класс
dann werden beim Kompilieren der Datei diese Fehler angezeigt:

'QuickSorts' - Vorlage stimmt nicht überein varQSort.mqh /*Fehler 1*/
'=' - Typ-Fehlanpassung ArrayList.mqh /*Fehler 2*/


Was sollte ich im Code korrigieren, um diese Typinkongruenz zu beseitigen? Ich verstehe nicht, warum es überhaupt dazu gekommen ist.

P.S.
<' - unzulässige Operation varQSort.mqh verwenden
spukt mir auch in diesem Konstrukt im Kopf herum. Genau diesen Fehler wollte ich loswerden. Aber ich verstehe diesen Fehler, und ich verstehe diese beiden nicht.
template <typename T1>
class VarQSort : public QuickSorts<T1>
//....

template <typename T1>
class ObjQSort : public QuickSorts<T1>
//....
 
fxsaber:
In der Tat ist der Diskrepanzfehler verschwunden und der andere mit ihm. Ich danke Ihnen.
 
Liebe Forumsmitglieder, ich brauche Hilfe beim Hinzufügen einiger Änderungen an der Funktion.
enum _EventYesNo{
      YES            = 1,           //ДА
      NO             = 2            //НЕТ
      };
enum howmuch {one = 1,              //Одна
              two = 2,              //Две
              three = 3             //Три
              };

input    _EventYesNo    monday                     = 2;                 //торгуем в ПОНЕДЕЛЬНИК?
input    howmuch        mondayHM                   = 1;                 //Сколько сделок?
input    string         monday_open1               = "00:00";           //
input    string         monday_open2               = "00:00";           //
input    string         monday_open3               = "00:00";           //

input    _EventYesNo    tuesday                    = 2;                 //торгуем во ВТОРНИК?
input    howmuch        tuesdayHM                  = 1;                 //Сколько сделок?
input    string         tuesday_open1              = "00:00";           //
input    string         tuesday_open2              = "00:00";           //
input    string         tuesday_open3              = "00:00";           //

input    _EventYesNo    wednesday                  = 2;                 //торгуем в СРЕДУ?
input    howmuch        wednesdayHM                = 1;                 //Сколько сделок?
input    string         wednesday_open1            = "00:00";           //
input    string         wednesday_open2            = "00:00";           //
input    string         wednesday_open3            = "00:00";           //

input    _EventYesNo    thursday                   = 2;                 //торгуем в ЧЕТВЕРГ?
input    howmuch        thursdayHM                 = 1;                 //Сколько сделок?
input    string         thursday_open1             = "00:00";           //
input    string         thursday_open2             = "00:00";           //
input    string         thursday_open3             = "00:00";           //

input    _EventYesNo    friday                     = 2;                 //торгуем в ПЯТНИЦУ?
input    howmuch        fridayHM                   = 1;                 //Сколько сделок?
input    string         friday_open1               = "00:00";           //
input    string         friday_open2               = "00:00";           //
input    string         friday_open3               = "00:00";           //

extern int         minutes = 5;          // Время торговли(минут) bool    HOUR = true;                     // Часы Вкл (true) / Выкл (folse) //Отправляет true если по времени разрешено торговать bool isTradeTimeString() { datetime servertime = TimeCurrent(); datetime localtime = TimeLocal(); datetime time = 0; datetime hbegin = 0; datetime hend = 0; string TimeBegin = "00:00"; if(DayOfWeek() == 1){if(monday == 1){TimeBegin = monday_open1;}else{return(false);}} if(DayOfWeek() == 2){if(tuesday == 1){TimeBegin = tuesday_open1;}else{return(false);}} if(DayOfWeek() == 3){if(wednesday == 1){TimeBegin = wednesday_open1;}else{return(false);}} if(DayOfWeek() == 4){if(thursday == 1){TimeBegin = thursday_open1;}else{return(false);}} if(DayOfWeek() == 5){if(friday == 1){TimeBegin = friday_open1;}else{return(false);}} string TimeEnd = TimeToString(StrToTime(TimeBegin)+(60*minutes),TIME_MINUTES); if(servertime > localtime) {   time = servertime - localtime;   hbegin = StrToTime(TimeBegin) + time;   hend = StrToTime(TimeEnd) + time; } if(servertime < localtime) {   time = localtime - servertime;   hbegin = StrToTime(TimeBegin) - time;   hend = StrToTime(TimeEnd) - time; } if(localtime == servertime) {   hbegin = StrToTime(TimeBegin);   hend = StrToTime(TimeEnd); } datetime dtBegin, dtEnd;        // Время начала и окончания работы int      hc, he;                // Часы текущего времени и окончания работы dtBegin=StrToTime(TimeToStr(TimeCurrent(),TIME_DATE)+" "+TimeToStr(hbegin,TIME_MINUTES)); dtEnd=StrToTime(TimeToStr(TimeCurrent(),TIME_DATE)+" "+TimeToStr(hend,TIME_MINUTES)); hc = TimeHour(TimeCurrent()); he = TimeHour(dtEnd); if(dtBegin>=dtEnd) {   if(hc>=he)    dtEnd+=24*60*60;   else    dtBegin-=24*60*60; } if(HOUR==true) {   if(TimeCurrent()>=dtBegin && TimeCurrent()<=dtEnd)    return(true);   else   {    if(CountTrades()==0)     return(false);   } } return(true); }

Ich brauche, z.B. am Montag, wenn ich 2 oder 3 Trades eröffnen muss, die Funktion vergleicht die Zeit und sendet die Pipe, aber ich habe bisher eine Zeit verglichen.


	          
 
Beim Export von Zitaten können Sie wählen, ab welchem Datum Sie sie herunterladen möchten.

Denn wenn Sie auf die Schaltfläche "Herunterladen" klicken, werden 6 000 000 Kurse heruntergeladen. Nicht jeder möchte die Festplatte mit Kursdaten füllen, lange warten, bis sie heruntergeladen sind, und dann unnötige Daten aus der Kurstabelle entfernen.

 

Hallo Lieber ... Können Sie mir sagen, warum der angegebene Trailing-Stop-Code für BUY-Aufträge korrekt funktioniert ...

       if (OrderType()==OP_BUY && (Bid-8*D*Point)>OrderStopLoss()&&(Bid-8*D*Point)>OrderOpenPrice()) 
{chk=OrderModify(OrderTicket(),0,NormalizeDouble(Bid-7*Point,Digits),NormalizeDouble(OrderOpenPrice()+25*D*Point,Digits),0,0);}

... ... aber der gleiche für SELL-Aufträge setzt keinen SL...

       if (OrderType()==OP_SELL &&(Ask+8*D*Point)<OrderStopLoss()&&(Ask+8*D*Point)<OrderOpenPrice()) 
{chk=OrderModify(OrderTicket(),0,NormalizeDouble(Ask+7*Point,Digits),NormalizeDouble(OrderOpenPrice()-25*D*Point,Digits),0,0);}

... Der Grund dafür ist höchstwahrscheinlich in der Bedingung(Ask+8*D*Point)<OrderStopLoss(), wenn wir sie entfernen, wird SL gesetzt, aber Trailing Stop funktioniert falsch ohne die angegebene Bedingung ...

FürBUY-Orders wirddie Bedingung(Bid-8*D*Point)>OrderStopLoss(), wennOrderStopLoss()==0, korrekt akzeptiert(d.h. irgendein Wert > 0) ...

... Aberdie Bedingung(Ask+8*D*Point)<OrderStopLoss(),OrderStopLoss()==0 ist nichtkorrekt ( d.h. irgendeinWert ist< 0

) ...

Ich bitte um Ratschläge, wie man im Code die erforderliche Bedingung(Ask+8*D*Point)<OrderStopLoss()für die korrekte Arbeit vonTrailing Stop mitSELL-Orderskorrekt formuliert.

Ich danke allen, die im Voraus geantwortet haben

.
 

Guten Tag: Es gibt eine Funktion, bei der der Indikator dieTick History Datei liest. Sie wird jedoch nur einmal gelesen, wenn der Indikator geladen oder aktualisiert wird. Wie kann ich erreichen, dass jedes Mal, wenn der erste Tick des Nullbalkens erscheint, dieser gelesen wird?

void ProcessOldCandles(int limit, TickStruct &lastTick)

{

      int hTicksFile = FileOpen(Symbol() + ".tks", FILE_BIN | FILE_READ | FILE_SHARE_READ | FILE_SHARE_WRITE);

   if (hTicksFile < 1)

      return;

      TickStruct tick;

   while (!IsStopped())

   {

      if (!IsReadTimeAndBidAskOfTick(hTicksFile, tick))

         return;

      if (tick.time >= Time[limit])

         break;

   }

   lastTick = tick;

   int barIndex = iBarShift(NULL, 0, tick.time);

      while (barIndex >= 0)

   {

      if (!IsReadTimeAndBidAskOfTick(hTicksFile, tick))

         return;

         if (!IsTickBelongToBar(tick, barIndex))

         barIndex = iBarShift(NULL, 0, tick.time);

         ProcessOneTick(barIndex, tick, lastTick);

   }

      FileClose(hTicksFile);

 
Yaroslav Nykula:

Hallo Lieber ... Können Sie mir sagen, warum dieser Trailing-Stop-Code für BUY-Aufträge korrekt funktioniert ...

... ... aber der gleiche für SELL-Aufträge setzt keinen SL...

... Der Grund dafür ist höchstwahrscheinlich in der Bedingung(Ask+8*D*Point)<OrderStopLoss(), wenn wir sie entfernen, wird SL gesetzt, aber Trailing Stop funktioniert falsch ohne die angegebene Bedingung ...

FürBUY-Aufträge wirddie Bedingung(Bid-8*D*Point)>OrderStopLoss(), wennOrderStopLoss()==0korrekt angenommen(d.h. irgendein Wert > 0) ...

... Aberdie Bedingung(Ask+8*D*Point)<OrderStopLoss(), wennOrderStopLoss()==0 wird nicht alskorrekt angesehen(d.h. irgendein Wert ist< 0

) ...

Ich bitte um Ratschläge, wie man im Code die erforderliche Bedingung(Ask+8*D*Point)<OrderStopLoss()für die korrekte Arbeit desTrailing Stop mitSELL-Orderskorrekt formuliert.

Ich danke allen, die im Voraus geantwortet haben

.

Hallo alle ... etwas sehr geringe Aktivität in diesem Forum Zweig ... das Problem wird auf diese Weise gelöst ...

 if (OrderSymbol()==Symbol()&&OrderType()==OP_SELL&&OrderLots()<=Lot*3&&(Ask+(Tral+TP)*D*Point)<OrderOpenPrice()&&((OrderStopLoss()!=0&&(Ask+Tral*D*Point)<OrderStopLoss())||OrderStopLoss()==0))
{chk=OrderModify(OrderTicket(),0,NormalizeDouble(Ask+Tral*D*Point,Digits),NormalizeDouble(OrderOpenPrice()-Stepp*D*Point,Digits),0,0);}} 

... Es ist ein bisschen lang, aber es funktioniert... Wer weiß, wie man es kürzer machen kann, kann es kürzen, ich würde es zu schätzen wissen... der Rest von uns kann es so nutzen, wie es ist.

 

die Funktion eingeben

OrderCloseByTicket (542534564)

Schließen Sie den Auftrag nach Ticket mit vollem Lot.

so dass Sie keine Angaben zu Lots, Preis und Slippage machen müssen.

ähnlich wie das Anklicken eines Kreuzes auf der Bestellung im Terminal.


die Funktion eingeben

OrderCloseByPos (0)

Schließen Sie den Auftrag nach Position ab.


und dann ist es nicht mehr nötig, diese umständlichen Konstruktionen vorzuschreiben.

  for (int i=1; i<=OrdersTotal(); i++)       //Цикл по всем ордерам,..
     {                                        //отражённым в терминале
      if(OrderSelect(i-1,SELECT_BY_POS)==true)//Если есть следующий
        {                                     
         // Здесь должен выполняться ..
         // ..анализ характеристик ордеров 
        }
     }                                        //Конец тела цикла
 

Hallo! Die beiden Minuszahlen q und w werden falsch verglichen, wenn sie gleich sind, denkt der if-Operator, dass die eine größer ist als die andere.Worin liegt der Fehler? Wenn q = -0,0002 und w ebenfalls -0,0002 ist, ist res12=falsch, warum?

double SPREAD=MarketInfo(Symb,MODE_SPREAD);// Спред
static bool res12=true;

start()
{   


   double q=High[0]-3.0*Point-High[1];
   double w=-SPREAD*Point;
      
   if (New_Bar==true&&ticket1<=0)
     {
      if(q>w)
       {
        res12=false; 
        Alert("res12=false");
        Alert (q);
        Alert (w);
       }
     }
      if (New_Bar==true&&ticket1<=0)
     {
        if(q<=w)
        {
         res12=true;
         Alert("res12=true");
         Alert (q);
         Alert (w);
        }
      }





}