Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 90

 
toni_starko consultor especializado trabalhou há 1,5 anos, agora não está na tabela.

a tese: movimento=vida, repouso=morte. O que diz no diário de bordo? está no canto inferior direito duas abas

se eu tivesse um - eu o verificaria e consertaria ...

 

Fórum sobre Comércio, Sistemas Automatizados de Comércio e Testes de Estratégia

Perguntas de Iniciantes MQL4 MT4 MetaTrader 4

Ilya Prozumentov, 2017.06.11 13:53

Há um modelo de classe para trabalhar com uma matriz.
#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;
}

Para esta classe de modelo, precisamos implementar a classificação, uma vez que a matriz pode armazenar tipos de dados complexos. Por exemplo:
ArrayList<PP*> *dde; // PP - класс

Posso escrever diferentes funções para tipos simples e complexos, mas o compilador não entende que as funções são rigidamente delimitadas por tipo de dados e continua jurando:
<' - uso ilegal da operação ArrayList.mqh

Por isso, decidi incorporar a interface:

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

Todas as partes da compilação da construção. Mas se você tentar declará-lo:
ArrayList<PP*> *dde; // PP - класс
então, ao compilar o arquivo, estes são os erros:

QuickSorts' - modelo não compatível varQSort.mqh /*error 1*/
'=' - tipo mismatch ArrayList.mqh /*error 2*/


O que devo corrigir no código para eliminar este tipo de descasamento? Eu não entendo porque isso ocorreu em primeiro lugar.

P.S.
<' - operação ilegal usar varQSort.mqh
também me assombra nesta construção. É precisamente deste erro que eu queria me livrar. Mas eu entendo este erro e não entendo estes dois.
template <typename T1>
class VarQSort : public QuickSorts<T1>
//....

template <typename T1>
class ObjQSort : public QuickSorts<T1>
//....
 
fxsaber:
De fato) O erro de discrepância desapareceu e o outro com ele. Obrigado.
 
Saudações, companheiros membros do fórum, preciso de ajuda para acrescentar algumas mudanças na função.
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); }

Eu preciso, por exemplo, na segunda-feira, se eu precisar abrir 2 ou 3 negociações, a função compara o tempo e envia o tubo, mas eu tenho uma vez comparada até agora.


	          
 
A exportação de citações permitirá que você escolha a partir de que data deseja baixá-las.

Porque ao pressionar o botão "download", 6 000 000 de cotações serão baixadas. Nem todos querem encher o disco rígido com dados de cotações, esperar muito tempo até que sejam baixadas, e então remover dados desnecessários da tabela de cotações.

 

Olá Querido ... Você pode me dizer por que o código de parada de rastreamento especificado para pedidos de COMPRA funciona corretamente ...

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

... ... mas o mesmo para pedidos de VENDA não define 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);}

... A razão está provavelmente na condição(Ask+8*D*Point)<OrderStopLoss(), se o removermos, SL será ajustado, mas Trailing Stop funciona incorretamente sem a condição especificada ...

Para ordens decompra ,a condição(Bid-8*D*Point)>OrderStopLoss(), seOrderStopLoss()==0, é aceitacorretamente (ou seja, algum valor > 0) ...

... Masa condição(Ask+8*D*Point)<OrderStopLoss(),OrderStopLoss()==0 não écorreta (ou seja, algumvalor é< 0

) ...

Por favor, informe como formular corretamente no código a condição requerida(Ask+8*D*Point)<OrderStopLoss()para o trabalho correto deTrailing Stop com ordens deVENDA.

Agradeço a todos vocês que responderam com antecedência

.
 

Boa tarde: Há uma função onde o indicador lê o arquivo dehistórico do tick. Mas ele é lido apenas uma vez, quando o indicador é carregado ou atualizado. Como posso fazer com que seja lido sempre que aparece o primeiro tique da barra de 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:

Olá Querido ... Você pode me dizer por que este código de Trailing Stop para pedidos de COMPRA funciona corretamente ...

... ... mas o mesmo para pedidos de VENDA não define SL...

... A razão está provavelmente na condição(Ask+8*D*Point)<OrderStopLoss(), se o removermos, SL será ajustado, mas Trailing Stop funciona incorretamente sem a condição especificada ...

Para ordens decompra ,a condição(Bid-8*D*Point)>OrderStopLoss(), quandoOrderStopLoss()==0 é tomadacorretamente (ou seja, algum valor > 0) ...

... Masa condição(Ask+8*D*Point)<OrderStopLoss(), quandoOrderStopLoss()==0 não é consideradacorreta (ou seja, algum valor é< 0

) ...

Por favor, informe como formular corretamente no código a condição requerida(Ask+8*D*Point)<OrderStopLoss()para o trabalho correto deTrailing Stop com ordens deVENDA.

Agradeço a todos vocês que responderam com antecedência

.

Olá a todos ... algo de muito baixa atividade neste ramo do fórum ... o problema é resolvido desta forma ...

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

... É um pouco longo, mas funciona... Quem sabe como encurtá-lo, pode encurtá-lo, eu agradeceria... o resto de nós pode usá-la como ela é.

 

entrar na função

OrderCloseByTicket (542534564)

Encerrar pedido por bilhete com lote completo.

para que você não tenha que especificar lotes, preço, deslizamento.

semelhante a clicar em uma cruz na ordem no terminal.


entrar na função

OrderCloseByPos (0)

fechar o pedido por posição.


e então não haverá necessidade de prescrever essas construções incômodas.

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

Olá! Os dois números menos q e w são comparados incorretamente, quando são iguais, o se operador pensa que um é maior que o outro. Qual é o erro? Quando q = -0,0002 e w é também -0,0002, res12=falso, por quê?

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





}
Razão: