Domande dai principianti MQL4 MT4 MetaTrader 4 - pagina 90

 
toni_starkl'Expert Advisor funzionava 1,5 anni fa, ora non è sul grafico.

la tesi: movimento=vita, riposo=morte. Cosa c'è scritto nel registro? è in basso a destra due schede

se ne avessi uno - lo controllerei e lo riparerei ...

 

Forum sul trading, sistemi di trading automatico e test di strategia

Domande dai principianti MQL4 MT4 MetaTrader 4

Ilya Prozumentov, 2017.06.11 13:53

C'è un modello di classe per lavorare con un 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;
}

Per questa classe modello, abbiamo bisogno di implementare l'ordinamento, dato che l'array può memorizzare tipi di dati complessi. Per esempio:
ArrayList<PP*> *dde; // PP - класс

Posso scrivere funzioni diverse per tipi semplici e complessi, ma il compilatore non capisce che le funzioni sono rigidamente delimitate dal tipo di dati e continua a imprecare:
'<' - operazione illegale usare ArrayList.mqh

Così ho deciso di incorporare l'interfaccia:

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

Tutte le parti del costrutto compilano. Ma se si cerca di dichiararlo:
ArrayList<PP*> *dde; // PP - класс
poi, quando si compila il file, questi sono gli errori:

'QuickSorts' - template mismatch varQSort.mqh /*errore 1*/
'=' - errore di tipo ArrayList.mqh /*errore 2*/


Cosa dovrei correggere nel codice per eliminare questo type mismatch? Non capisco perché sia successo in primo luogo.

P.S.
'<' - operazione illegale usare varQSort.mqh
mi perseguita anche in questo costrutto. È proprio di questo errore che volevo sbarazzarmi. Ma capisco questo errore e non capisco questi due.
template <typename T1>
class VarQSort : public QuickSorts<T1>
//....

template <typename T1>
class ObjQSort : public QuickSorts<T1>
//....
 
fxsaber:
Infatti) L'errore di discrepanza è scomparso e l'altro con esso. Grazie.
 
Saluti ai membri del forum, ho bisogno di aiuto per aggiungere alcune modifiche alla funzione.
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); }

Ho bisogno, per esempio il lunedì, se ho bisogno di aprire 2 o 3 trade, la funzione confronta il tempo e invia il tubo, ma ho un solo tempo confrontato finora.


	          
 
L'esportazione delle citazioni vi permetterà di scegliere da quale data volete scaricarle.

Perché quando si preme il pulsante "download", 6 000 000 citazioni saranno scaricate. Non tutti vogliono riempire l'hard disk con i dati delle citazioni, aspettare a lungo che siano scaricati, e poi rimuovere i dati inutili dalla tabella delle citazioni.

 

Ciao caro ... Potete dirmi perché il codice di trailing stop specificato per gli ordini BUY funziona correttamente ...

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

... ... ma lo stesso per gli ordini SELL non imposta 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);}

... La ragione è molto probabilmente nella condizione(Ask+8*D*Point)<OrderStopLoss(), se la rimuoviamo, SL sarà impostato, ma Trailing Stop funziona in modo errato senza la condizione specificata ...

Per gli ordiniBUY ,la condizione(Bid-8*D*Point)>OrderStopLoss(), seOrderStopLoss()==0, è accettatacorrettamente (cioè qualche valore > 0) ...

... Mala condizione(Ask+8*D*Point)<OrderStopLoss(),OrderStopLoss()==0 non ècorretta ( cioè qualchevalore è< 0

) ...

Vi prego di consigliarmi come formulare correttamente nel codice la condizione richiesta(Ask+8*D*Point)<OrderStopLoss()per il corretto funzionamento delTrailing Stop con ordiniSELL

.

 

Buon pomeriggio: c'è una funzione in cui l'indicatore legge il file dellastoria dei tick. Ma viene letto solo una volta, quando l'indicatore viene caricato o aggiornato. Come posso farlo leggere ogni volta quando appare il primo tick della barra zero?

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:

Ciao caro ... Potete dirmi perché il codice di trailing stop specificato per gli ordini BUY funziona correttamente ...

... ... ma lo stesso per gli ordini SELL non imposta SL...

... La ragione è molto probabilmente nella condizione(Ask+8*D*Point)<OrderStopLoss(), se la rimuoviamo, SL sarà impostato, ma Trailing Stop funziona in modo errato senza la condizione specificata ...

Per gli ordiniBUY ,la condizione(Bid-8*D*Point)>OrderStopLoss(), quandoOrderStopLoss()==0 è presacorrettamente (cioè qualche valore > 0) ...

... Mala condizione(Ask+8*D*Point)<OrderStopLoss(), quandoOrderStopLoss()==0 non è consideratacorretta (cioè qualche valore è< 0

) ...

Vi prego di consigliarmi come formulare correttamente nel codice la condizione richiesta(Ask+8*D*Point)<OrderStopLoss()per il corretto funzionamento delTrailing Stop con ordiniSELL

.


Ciao a tutti ... qualcosa di molto bassa attività in questo ramo del forum ... il problema è risolto in questo modo ...

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

... È un po' lungo, ma funziona... Chi sa come accorciarlo, può accorciarlo, lo apprezzerei... il resto di noi può usarlo così com'è.

 

inserire la funzione

OrderCloseByTicket (542534564)

Chiudere l'ordine per biglietto con lotto completo.

in modo da non dover specificare lotti, prezzo, slippage.

simile a cliccare una croce sull'ordine nel terminale.


inserire la funzione

OrderCloseByPos (0)

chiudere l'ordine per posizione.


e allora non ci sarà bisogno di prescrivere queste costruzioni ingombranti.

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

Ciao, i due numeri meno q e w sono confrontati in modo errato, quando sono uguali, l'operatore if pensa che uno sia maggiore dell'altro, qual è l'errore? Quando q = -0,0002 e w è anche -0,0002, res12=falso, perché?

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





}
Motivazione: