[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 842

 
Você tem a modificação do pedido no mesmo bloco que a abertura, e sua condição é não haver pedidos. Acontece que você acaba de abrir um pedido e imediatamente tenta modificá-lo - mas de onde virá o lucro de 5 pips?
 

Olá a todos! recentemente se interessaram por médias móveis. Encontrei alguma combinação de médias móveis e condições comerciais e decidi verificar meu TS, se é lucrativo ou não, e otimizá-lo, se for o caso. Mas meu Consultor Especialista não abriu negócios durante os testes. Passei a noite inteira tentando descobrir a solução e decidi perguntar a vocês, caros programadores. Para entender como funciona a EA, explicarei brevemente meu TS: no gráfico com EMA(13) e EMA(55), se uma barra cruzou EMA(13) e todas as barras seguintes estavam acima/abaixo de EMA(13), então ao tocar o preço com MA(13) abrimos uma posição na direção das barras anteriores (depois de cruzar + pelo menos 9 e não mais que 23). Take Profit 60 pontos, Stop Loss = EMA(55) mais cinco pontos negativos. Essa é na verdade toda a estratégia. Para melhor ilustração, eu coloquei um exemplo:

E aqui está o código do Conselheiro Especialista:

//+------------------------------------------------------------------+
//|                                                          DWM.mq4 |
//|                                 Copyright © 2010, Bobkov Vasiliy |
//|                                          http://www.forex4you.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, Bobkov Vasiliy"
#property link      "http://mql4.com"
extern double Lot=0.1;
extern int FastMA=13;         //Быстрая МА
extern int SlowMA=54;         //МедленнаяМА
extern int TP=60;             //Тейк профит
extern int MinBars=8;         //Минимальное кол-во баров вне МА
extern int MaxBars=25;        //Максимальное кол-во баров вне МА
extern int slippage=3;        //Слипадж
extern int Magic=347586;      //Магическое число
extern int Space=10;          //Отступ от МА при тралле ордеров

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
if (OrderCheck()==true)                                        //Проверяем, есть ли ордер...
   {                                                           //...если ордер есть...
   Trall();                                                    //Траллим
   return (0);
   }
else                                                           //...если нет открытых позиций то...
   {
   double FMA=MA(0);
   double SMA=iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0);
   for (int x=1;;x++)                                          //Вычесляем сколько баров вне МА...
      {
      if (MA(x)<High[x]&& MA(x)>Low[x]) break;
      }
   if (Bid==FMA && x>MinBars && x<MaxBars)                     //Если условия выполняются, то...
      {
      if (FMA>SMA ) OrdOpen(0,SMA);                            //...открывем сделку на покупку
      if (FMA<SMA) OrdOpen(1,SMA);                             //...или на продажу
      }
   }   
//----
   return(0);
  }
//+------------------------------------------------------------------+

bool OrderCheck()                                              //Функция проверки позиций
   {
   for(int i=1;i<=OrdersTotal();i++)
      {
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
         if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) return(true);
         }
      else
         Print("OrderSelect() вернул ошибку - ",GetLastError());
          
      }
    return(false);
   }

void OrdOpen(int type,double SO)                               //Функция открытия позиций
   {
   if (type==0) 
      {
      if (OrderSend(Symbol(),0,Lot,Ask,slippage,SO-Space*Point,Ask+TP*Point,NULL,Magic,0,Blue)==true) return;
      else Print("OrderSend() вернул ошибку - ",GetLastError());
      }
   else 
      {
      if (OrderSend(Symbol(),0,Lot,Bid,slippage,SO+Space*Point,Bid-TP*Point,NULL,Magic,0,Blue)==true) return;
      else Print("OrderSend() вернул ошибку - ",GetLastError());
      }
   return;
   }
   
void Trall()                                                    //Трейллинг стоп
   {
   if (OrderSelect(Magic,SELECT_BY_TICKET)==true)
      {
      double SL=iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0);
      if (Bid<iMA(NULL,0,SlowMA,0,MODE_EMA,PRICE_CLOSE,0)) SL=SL+Space*Point;
      else SL=SL-Space*Point;
      if (OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(SL,Digits),OrderTakeProfit(),0,Blue)==true) return;
      else Print("OrderModify() вернул ошибку - ",GetLastError());
      }
   return;
   }
double MA(int m)                                                  //Функция возвращающая значение МА
   {
   return(iMA(NULL,0,FastMA,m,MODE_EMA,PRICE_CLOSE,0));
   }

Se alguém puder ajudar, por favor. Eu também lhe darei a própria EA

Arquivos anexados:
dwm.mq4  5 kb
 

Muitas funções podem ser coletadas em um ciclo para abrir, mudar, fechar posições, etc.

Aqui está um exemplo simples:

            bool Ans=OrderModify(Ticket,Price,SL,TP,0);
            if (Ans==true) {
               Alert ("Ордер ",Text,Ticket," модифицирован:)");
               break;                           // Из цикла модифи.
            }

- Pergunta: é correto usar "quebrar" em vez de "devolver" aqui? Há alguma diferença?

 
chief2000:

Muitas funções podem ser coletadas em um ciclo para abrir, mudar, fechar posições, etc.

Aqui está um exemplo simples:

- Pergunta: é correto usar "quebrar" em vez de "devolver" aqui? Há alguma diferença?

A partir de https://docs.mql4.com/ru/basis/operators/break:
"A declaração de interrupção interrompe a execução do interruptor externo aninhado mais próximo, enquanto, ou por declaração". O controle é dado ao operador que segue aquele que termina".

A partir de https://docs.mql4.com/ru/basis/operators/return:
"A declaração de retorno encerra a função atual e devolve o controle ao programa de chamada".

Resposta: É correto usar "intervalo" aqui.

 
abolk:

A partir de https://docs.mql4.com/ru/basis/operators/break:
"A declaração de interrupção encerra a execução do interruptor externo aninhado mais próximo, enquanto ou para declaração". O controle é dado ao operador que segue aquele que termina".

A partir de https://docs.mql4.com/ru/basis/operators/return:
"O operador de retorno encerra a função atual e retorna o controle ao programa de chamada".

Resposta: é correto usar "break" aqui.

Na verdade, eu mesmo uso break, mas pensei que o retorno significava uma mudança de carrapato (e break não significava).

Na realidade, até que a ordem mude, haverá uma mudança de tick, portanto, para que o testador possa simular corretamente a situação

você precisa usar retorno. Certo?

Talvez eu esteja enganado, mas gostaria de entendê-lo.

 
chief2000:

Na verdade, eu mesmo uso o break, mas pensei que o retorno significava uma mudança de carrapato (enquanto o break não significa).

Na realidade, até que a ordem mude, a mudança de tick ocorrerá e, portanto, o testador deve usar o retorno para simular corretamente a situação

você precisa usar retorno. Certo?

Talvez eu esteja enganado, mas quero entendê-lo.

Vamos ler na documentação: "O operador de retorno deixa de executar a função atual e retorna o controle ao programa de chamada".

Se a função de início() atual, leia novamente a documentação:

https://docs.mql4.com/ru/runtime/start
"Quando uma nova cotação chega, a função de Expert Advisors e indicadores personalizados é executada. Se na chegada de uma nova cotação, a função iniciar(), executando a cotação anterior, é executada, então a cotação recebida será ignorada pelo Expert Advisor. Todas as novas citações, vindas durante a execução do programa, são ignoradas até que a próxima execução da função start() seja concluída. Depois disso, a função start() será lançada somente após a próxima nova cotação.

 
abolk:

Leia na documentação: "A declaração de retorno encerra a função atual e devolve o controle ao programa de chamada".

Se a função atual for iniciada(), leia novamente na documentação:

https://docs.mql4.com/ru/runtime/start
"Quando novas citações são feitas, a função começa() para Expert Advisors anexos e indicadores personalizados. Se na chegada de uma nova cotação, a função iniciar(), executando a cotação anterior, é executada, então a cotação recebida será ignorada pelo Expert Advisor. Todas as novas citações, vindas durante a execução do programa, são ignoradas até que a próxima execução da função start() seja concluída. Depois disso, a função start() será lançada somente após a próxima nova cotação.

Gostaria que você colocasse isso em suas próprias palavras. Eu não entendo o que você quer dizer.

No testador, se for terminado com pausa e alguma outra função o seguir, será executado no mesmo tick. Mas, na realidade, vários carrapatos podem mudar durante este tempo (enquanto a ordem está sendo modificada). É por isso que eu acho que o retorno é mais realista. Não é?

 
chief2000:

Gostaria que você tivesse colocado em suas próprias palavras. Eu não entendo o que você quer dizer.

Se for terminado com pausa e seguido por alguma outra função, será executado no mesmo tick. Mas, na realidade, vários carrapatos podem mudar durante este tempo (enquanto a ordem está sendo modificada). É por isso que eu acho que o retorno é mais realista. Não é assim?


start() começa no início de um tick e pode não estar terminado no início do tick seguinte.

break termina para, e o retorno termina a função. Se não houver operadores depois de para, não há diferença no uso e retorno para este algoritmo.

Mas cada operador tem seu propósito. E o uso não intencional de um operador é como uma espingarda descarregada.

Novamente, no algoritmo de loop, por alguma razão não há necessidade de continuar executando a função, podemos usar o retorno.

Em outras palavras, se o algoritmo requer uma quebra no laço, então a quebra é usada, mesmo que a função ainda seja terminada após o laço.

 
abolk:


start() começa a funcionar no início de um tick e seu trabalho pode não terminar no início do tick seguinte.

break completa para, return completa a função. Se não houver operadores depois de para, não há diferença entre usar para e retornar para este algoritmo.

Mas cada operador tem seu propósito. E o uso não intencional de um operador é como uma espingarda descarregada.

Novamente, no algoritmo de loop, por alguma razão não há necessidade de continuar executando a função, podemos usar o retorno.

Em outras palavras, se o algoritmo exigir que rompamos o laço, nós colocamos a quebra, mesmo que a função termine após o laço de qualquer maneira.

Ocorreu-me um pensamento, já que tudo isso foi destinado apenas ao testador, podemos (quando necessário) fazer o seguinte:

if(IsTesting()==true   ||   IsOptimization()==true) {
   return;
}

break;

Obrigado!

 
chief2000:

Surgiu uma idéia - já que isto só foi iniciado para um testador, você poderia (quando apropriado) fazer o seguinte:

Obrigado!


você pode
Razão: