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

 
trader781:
Não sei como explicar isso. Mas é definitivamente uma obra-prima.
Estou lhe dizendo, eles gostam de ser sarcásticos aqui). E Trishkin ficou ofendido com isso. Ele disse que teria um código para ajudar.
 
Movlat Baghiyev:
Estou lhe dizendo que eles gostam de ser sarcásticos aqui )))) Trishkin também se ofendeu. Ele disse que o código vai ajudar.

Sou tão novo quanto você, mas até eu tenho muitas perguntas

for(int i=0; i<OrderTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS)==verdadeiro)
{
if(OrderSymbol()!=Symbol() ||OrderMagicNumber()!=Magic) continuar;
if(OrderType()==OP_BUY||||Po_BUYOrderType()==OP_SELL) p++;
if(OrderType()==OP_BUYSTOP)
if(signal_bue)OrderDelete(OrderTicket());
senão b++;
se(OrderType()==OP_SELLSTOP)
se(signal_sell)OrderDelete(OrderTicket());
mais s++;
}

}

1) onde você conseguiu b++

2) onde você conseguius+++

3)se(sinal_bue) é o que mais?

E o resto do código. Desculpe se eu o ofendi.

 
Essa é provavelmente a maneira correta de fazer isso.
//+------------------------------------------------------------------+
//|                                                      ОТЛОЖКИ.mq4 |
//+------------------------------------------------------------------+
extern double StopLoss     = 100; //Стоплосс ордера  
extern double TakeProfit   = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал
extern int    Delta        = 100; //Расстояние от цены для установки ордера
extern double LOT          = 0.1; //Объём позиции
extern int    Magic        =2;
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  if (TrailingStop!=0) Trailing();
  
   //ИНДИКАТОР RSI
   double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
   double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);
  
   int b = 0, s = 0, p = 0, res = 0;

   double BuyPrice=Ask+Delta*Point;
   double SellPrice=Bid-Delta*Point;
  
   for (int i=0; i<OrdersTotal(); i++)
    {
     if (OrderSelect(i, SELECT_BY_POS)==true)
      {
        if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) p++;
        if (OrderType()==OP_BUYSTOP)
        {
           if(RSI0<50&&RSI1>50)
                OrderDelete(OrderTicket());
            else
                b++;
        }
        if (OrderType()==OP_SELLSTOP)
        {
           if(RSI0>50&&RSI1<50)
                OrderDelete(OrderTicket());
              else
                s++;
        }
      }
    }

   double SL,TP; // < !!!!!!!!! эти переменные не используются, можно удалить

//---- buy stop
   if(RSI0>50&&RSI1<50 && p<1 && b<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
     }        
//---- sell stop  
   if(RSI0<50&&RSI1>50 && p<1 && s<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
     }
//----
   return(0);
}
 
Movlat Baghiyev:
Estou lhe dizendo, eles gostam de ser sarcásticos aqui). E Trishkin se ofendeu com isso. Ele disse que me ajudaria com o código.

É mais simples assim:

void OrderDelete_(int Type)
  {
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
         if(OrderType()==Type)
            OrderDelete(OrderTicket());
        }
     }
  }

Está em algum lugar fora da função OnTick() vazia.

if (сигнал_bue) OrderDelete_(OP_SELLSTOP);

if (сигнал_sell)OrderDelete_(OP_BUYSTOP);

E isto está no corpo funcional OnTick() vazio.

 
Alekseu Fedotov:


E isto está no corpo de função OnTick() vazio.

Favor fazer correções no código
 
trader781:

Certo.

Acabei o que pude. A descrição é feita. O objetivo é entender por que não funciona como eu quero.

mais dentro do bloco if(). Era realmente assim que se pretendia?

Além disso. A função Counts() aceita uma contagem de variáveis globais não inicializadas que, além disso, é definida mais uma vez dentro da função.

A função Counts() conta as ordens, mas as compara a alguns tickets que mudam várias vezes na função principal. Mas o valor do bilhete é o mesmo durante a operação da função. Então, quantos pedidos serão calculados pela função? É mais de um?

Nesta forma, esta função não precisa de argumentos. Basta chamá-la e deixá-la retornar o resultado.

A seguir. Função FindLastOType() é novamente uma comparação com o bilhete. Você pode garantir que ele é comparado a um bilhete válido? Não é mais fácil quebrar o laço quando a primeira encomenda com o número mágico e o símbolo necessários é encontrada e depois devolver o tipo de encomenda?

O mesmo com FindLastOrderOpenPrice() e FindLastLot().

A função ModifyOrders() me horrorizou tanto que eu não olharia para ela por muito tempo para evitar pesadelos à noite...

 
Movlat Baghiyev:
Favor fazer correções no código

Experimente ^_~

extern double StopLoss     = 100; //Стоплосс ордера  
extern double TakeProfit   = 150; //Тейкпрофит ордера
extern double TrailingStop = 100; // трал
extern int    Delta        = 100; //Расстояние от цены для установки ордера
extern double LOT          = 0.1; //Объём позиции
extern int    Magic        =2;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer


//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer


  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
  
  int  res = 0;

//ИНДИКАТОР RSI
   double RSI0=iRSI(NULL,0,5,PRICE_CLOSE,0);
   double RSI1=iRSI(NULL,0,5,PRICE_CLOSE,1);

   double BuyPrice=Ask+Delta*Point;
   double SellPrice=Bid-Delta*Point;
  
//---- buy stop
   if(RSI0>50&&RSI1<50 && Number(OP_BUYSTOP)<0 && Number(OP_BUY)<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_BUYSTOP,LOT,BuyPrice,0,BuyPrice-StopLoss*Point,BuyPrice+TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_SELLSTOP,Blue);
     }        
//---- sell stop  
   if(RSI0<50&&RSI1>50 && Number(OP_SELLSTOP)<0 && Number(OP_SELL)<1) // < !!!!!!!!!
     {
      res=OrderSend(Symbol(),OP_SELLSTOP,LOT,SellPrice,0,SellPrice+StopLoss*Point,SellPrice-TakeProfit*Point,"ОТЛОЖКИ",Magic,OP_BUYSTOP,Red);
     }
//----  
  
  
if (RSI0>50&&RSI1<50) OrderDelete_(OP_SELLSTOP);

if (RSI0<50&&RSI1>50)OrderDelete_(OP_BUYSTOP);

  }

//+------------------------------------------------------------------+
void OrderDelete_(int Type)
  {
  bool  r;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
         if(OrderType()==Type)
          r = OrderDelete(OrderTicket());
        }
     }
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
int Number(int Type)
  {
  int kp=0;
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS)==true)
        {
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=Magic) continue;
         if(OrderType()==Type)
            kp++;
        }
     }
  return(kp);  
  }
//+------------------------------------------------------------------+
 
Alekseu Fedotov, obrigado. Deus o abençoe.
 
Vitalie Postolache:

mais dentro do bloco if(). Era realmente para ser assim?

Além disso. A função Counts() aceita uma contagem de variáveis globais não inicializadas que também é declarada mais uma vez na própria função.

A função Counts() conta as ordens, mas as compara a alguns tickets que mudam várias vezes na função principal. Mas o valor do bilhete é o mesmo durante a operação da função. Então, quantos pedidos serão calculados pela função? É mais de um?

Nesta forma, esta função não precisa de argumentos. Basta chamá-la e deixá-la retornar o resultado.

A seguir. Função FindLastOType() é novamente uma comparação com o bilhete. Você pode garantir que ele é comparado a um bilhete válido? Não é mais simples interromper o loop quando a primeira encomenda com o número mágico e o símbolo necessários é encontrada e depois devolver o tipo de encomenda?

O mesmo com FindLastOrderOpenPrice() e FindLastLot().

Função ModifyOrders() me aterrorizou tanto que eu não olharia para ele por muito tempo para evitar pesadelos à noite...

Correção

Não há outra maneira de colocá-lo em outro lugar, serão parâmetros errados

Tem que levar em conta o mais recente

Vou tentar mudar isso.

Eu tentei usar o OrderModify() padrão, mas ele é banido se eu mover um monte de pedidos simultaneamente e constantemente

Obrigado pela crítica.

 
spoiltboy:
Sim, isso é um erro de impressão no suporte. O resto da pergunta é válida.

bool condition;

if(condition) {}

equivale a

if(condition==true) {}

и

if(!condition) {}

igual a

if(condition==false) {}

É apenas mais curto e mais familiar.

Razão: