Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1779

 

Olá !

Favor verificar onde cometi um erro (não quer trabalhar)

Quero que o sinal de compra seja deslocado pelodesvio * _Ponto (definido em configurações)if(GetLotSize()>LotControl)

LotControl - também definido nas configurações

GetLotSize() - como recomendado:

double GetLotSize()
  {
   double Ls=0;
   datetime last = 0, openTime;
   for (int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
           {
             if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
               if ((openTime = OrderOpenTime()) > last) {
                 last = openTime;
                 Ls = OrderLots();
               }
             }
           }
        }
     }
   return Ls;
  }
void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
 {

  if(GetLotSize()>LotControl)  {openPrice = dMA + deviation * _Point;}
   
  else 
  openPrice = dMA;
   //Если появился сигнал на покупку, то откроем ордер на покупку
   if(bSignalBuy() == true)
   vOrderOpenBuy();
   
// Если появился сигнал на продажу, то откроем ордер на продажу
   if(bSignalSell() == true)
   vOrderOpenSell();
  
     }
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfit

 // if(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)
 //    {
// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка
 //     CloseOrder();
 //    }
DrawLABEL("lab_Take",1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2),AC));
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция проверки открытых оредров |
//+-----------------------------------------------------------------------------------------------+
int CountOrders() 
  {
   int cnt=0;
   int i=OrdersTotal()-1;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol)
           {
            if(OrderMagicNumber()==Magic) cnt++;
           }
        }
     }
   return(cnt);
  }
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на покупку |
//+-----------------------------------------------------------------------------------------------+
bool bSignalBuy()
  {
   if (openPrice > Open[1] && openPrice < Close[1]) //Open[1] и Close[1]- цены открытия и закрытия каждого бара текущего графика.
   
  return(true);
   
  return(false);
  }
 
//+-----------------------------------------------------------------------------------------------+
//|                                                             Функция поиска сигнала на продажу |
//+-----------------------------------------------------------------------------------------------+
bool bSignalSell()
   
  {
   if(openPrice< Open[1] && openPrice > Close[1])

   return(true);

   return(false);
  }

 
законопослушный гражданин #:

Obrigado. Não teve qualquer efeito por algum motivo.

//+----------------------------------------------------------------------------+
if(bSignalBuy())
  {
   if(GetLotSize()>LotControl) vOrderOpenSell();
   else vOrderOpenBuy();
  }
//+----------------------------------------------------------------------------+
double GetLotSize()
  {
   double Ls=0;
   datetime t=0;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();}
              }
           }
        }
     }
   return Ls;
  }
//+----------------------------------------------------------------------------+
 
законопослушный гражданин #:

Obrigado. Não teve qualquer efeito por algum motivo.

Eu escrevi:

if (bSignalBuy()) {
  if (GetLotSize() > LotControl)
    vOrderOpenSell();
  else
    vOrderOpenBuy();
}

Mas ainda abre duas posições direcionadas de forma diferente no mesmo carrapato? Isso não pode estar certo!

double GetLotSize()
  {
   double Ls=0;
   datetime last = 0, openTime;
   for (int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
           {
             if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
               if ((openTime = OrderOpenTime()) > last) {
                 last = openTime;
                 Ls = OrderLots();
               }
             }
           }
        }
     }
   return Ls;
  }

Sobre este código, pode muito bem ser que nada tenha mudado. Uma vez que as ordens são executadas na ordem de fechamento.

Ordene seu algoritmo da melhor forma possível.

void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.

// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
 {

  if(GetLotSize()>LotControl)  {openPrice = dMA + deviation * _Point;}
   
  else 
  openPrice = dMA;
   //Если появился сигнал на покупку, то откроем ордер на покупку
   if(bSignalBuy() == true)
   vOrderOpenBuy();
   
// Если появился сигнал на продажу, то откроем ордер на продажу
   if(bSignalSell() == true)
   vOrderOpenSell();
  
     }
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfit

 // if(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)
 //    {
// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка
 //     CloseOrder();
 //    }
DrawLABEL("lab_Take",1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2),AC));
  }

Você deve verificar seu algoritmo. Aqui, você está entrando pelos sinais Comprar e Vender e nada mais. O que pode não funcionar aqui? Sem funções de entrada, sem funções de saída do mercado.

 

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Qualquer pergunta de novatos sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos

MakarFX, 2021.12.02 18:30

//+----------------------------------------------------------------------------+
if(bSignalBuy())
  {
   if(GetLotSize()>LotControl) vOrderOpenSell();
   else vOrderOpenBuy();
  }
//+----------------------------------------------------------------------------+
double GetLotSize()
  {
   double Ls=0;
   datetime t=0;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();}
              }
           }
        }
     }
   return Ls;
  }
//+----------------------------------------------------------------------------+

O que há aqui dentro? Você não mudou nada na essência. Você acabou de fazer mais ligações para OrderCloseTime. O código foi esticado em uma linha. E tornou-se menos legível. Mas o resultado ainda é o mesmo.

 
Mihail Matkovskij #:

E aqui? Você não mudou nada na essência. Você acabou de fazer mais ligações para OrderCloseTime. Mas o resultado é o mesmo.

Abra seus olhos
 
MakarFX #:
abra seus olhos

Argumentos no estúdio, por favor

 
Mihail Matkovskij #:

Argumentos no estúdio, por favor.

Agora abra seus olhos

 
Mihail Matkovskij #:

E aqui? Você não mudou nada na essência. Você acabou de fazer mais ligações para OrderCloseTime. E nós esticamos o código em uma linha. E tornou-se menos legível. Mas o resultado é o mesmo.

Tanto quanto eu posso ver, a diferença está no seguinte:

double GetLotSize()
  {
   double Ls=0;
   datetime last = 0, openTime;
   for (int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
           {
             if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
               if ((openTime = OrderOpenTime()) > last) {
                 last = openTime;
                 Ls = OrderLots();
               }
             }
           }
        }
     }
   return Ls;
  }



double GetLotSize()
  {
   double Ls=0;
   datetime t=0;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();}
              }
           }
        }
     }
   return Ls;
  }
мне как то объясняли, что один вариант считает с конца списка, а второй с начала.
 
MakarFX #:

Agora abra seus olhos.

(suspiros) Está bem. Eu perdi esse momento. Eu admito isso.

 
законопослушный гражданин #:

até onde eu posso ver, a diferença é a seguinte:

double GetLotSize()
  {
   double Ls=0;
   datetime last = 0, openTime;
   for (int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if (OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if (OrderSymbol() == _Symbol && OrderMagicNumber() == Magic)
           {
             if(OrderType() == OP_BUY || OrderType() == OP_SELL) {
               if ((openTime = OrderOpenTime()) > last) {
                 last = openTime;
                 Ls = OrderLots();
               }
             }
           }
        }
     }
   return Ls;
  }




double GetLotSize()
  {
   double Ls=0;
   datetime t=0;
   int i=OrdersHistoryTotal();
   for(int pos=0; pos<i; pos++)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_HISTORY))
        {
         if(OrderSymbol()==_Symbol && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               if(t<OrderCloseTime()) {t=OrderCloseTime(); Ls=OrderLots();}
              }
           }
        }
     }
   return Ls;
  }