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

 
Olá! eu não consegui encontrar um tópico sobre atualização do terminal Metatrader 4 para Android 2.3, então por favor não me chute muito por postar neste tópico. No mercado, o terminal é apenas para Android 4+. Onde posso obter uma atualização, porque o meu deixou de funcionar.
 
k19alex69:
Olá, não encontrei um tópico sobre atualização do terminal Metatrader 4 para Android 2.3, portanto, por favor, não me chute muito por postar neste tópico. No terminal do mercado somente para Android 4+. Onde posso obter uma atualização, porque o meu deixou de funcionar.
 
Sergey Basov:

Eu não tenho nada a explicar para que ninguém responda. O gráfico que você mostrou não tem sentido e é um mistério como ele foi obtido.

A opção "Superfície bidimensional" na aba "Gráfico de otimização" do testador faz sentido (imho) quando é necessário otimizar 2 parâmetros de entrada de um EA, ou ver visualmente em que valores de 2 parâmetros no histórico foram bons resultados, se esses parâmetros são interdependentes, e se fazem sentido de todo.

Você tem apenas 0 em ambos os eixos por alguma razão, e verticalmente estes 0 estão divididos em 3 passos intermediários, assim você tem "cubos um no centro, dois mais baixos/mais altos, e dois/três em um quadrado". E os resultados parecem aleatórios - "cubos" brancos e verdes estão espalhados aleatoriamente. Portanto, o gráfico não tem sentido e não parece significar nada.

O gráfico pode não fazer sentido, mas após a otimização no período de 2014-2015 e ao selecionar e estabelecer melhores parâmetros e testes de 2014 até hoje, o resultado do prejuízo / drawdown permanece inalterado, bem, o lucro aumenta na proporção do período. Além disso, o bot estava trabalhando em uma demonstração durante um mês, e durante os testes do último mês com parâmetros padrão todos os acordos coincidem com o testador = +5pp. Portanto, não vou brincar com os cubos e sua cor.

Obrigado pelo esclarecimento.

 
Olá!
Estou tentando aprender MQL4 e, portanto, por favor, não se sinta mal com minha pergunta.
Por favor, informe como calcular corretamente o SL e TP para um pedido pendente, caso ele não seja colocado no preço atual, mas no preço obtido durante os cálculos?
Eles devem ser calculados com base no comprimento do castiçal. É aproximadamente assim:
TP=NormalizeDouble(((iOpen(NULL,0,1))-(iLow(NULL,0,1)))*KoefTP*Point,Digits);
Obrigado!
 
Viachaslau Baiko:
Olá!
Estou tentando aprender MQL4, portanto, não se sinta mal com minha pergunta.
Favor informar como calcular corretamente SL e TP para um pedido pendente e se este não for colocado ao preço atual, mas ao preço obtido durante os cálculos.
Eles devem ser calculados com base no comprimento do castiçal. É aproximadamente assim:
TP=NormalizeDouble(((iOpen(NULL,0,1))-(iLow(NULL,0,1)))*KoefTP*Point,Digits);
Obrigado!

Aqui estão as funções que irão calcular as ordens de parada corretas para qualquer tipo de ordem:

//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
   int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
   int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   return((lv==0)?sp*2:lv);
   }
//+------------------------------------------------------------------+
 
void OnTick()
  {
//---
   MqlDateTime server_time;
   TimeToStruct(TimeCurrent(),server_time);
   //--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0
   if(server_time.min%minutesBefore==0 || server_time.min==0) {
      if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_BUY) {
         //--- получили сигнал на покупку
         Print("Сигнал на покупку ",TimeCurrent());   // Проверочное сообщение в журнал
         //--- проверка наличия уже открытой позиции на покупку
         if (OrdersTotal() == 0)  
         {
         ticket=OrderSend(Symbol(),OP_BUY, Lts, Ask, 0, 0, 0, NULL, 1234, 0, Blue);  
         Alert ("Есть сигнал на покупку  ", sim, per);
         }
         if (OrdersTotal() >0)  
    
     if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
     if(OrderType()==OP_SELL)
     {
     OrderClose(ticket, OrderLots(), Bid,0,Blue);
     {
     ticket=OrderSend(Symbol(),OP_BUY, Lts, Ask, 0, 0, 0, NULL, 1234, 0, Blue);
     Alert ("Есть сигнал на закрытие продажи и открытие покупки  ", sim, per);
     }
     }
    
    
         //--- вызов функции открытия позиции на покупку
         }
      if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_SELL) {
         //--- получили сигнал на продажу
         Print("Сигнал на продажу ",TimeCurrent());   // Проверочное сообщение в журнал
         //--- проверка наличия уже открытой позиции на продажу
         if (OrdersTotal() == 0)  
         {
         ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, 0, 0, 0, NULL, 1234, 0, Red);
         Alert ("Есть сигнал на продажу  ", sim, per);
         }
         if (OrdersTotal() >0)  
    
     if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
     if(OrderType()==OP_BUY)
     {
     OrderClose(ticket, OrderLots(), Ask,0,Red);
     {
     ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, 0, 0, 0, NULL, 1234, 0, Red);
     Alert ("Есть сигнал на закрытие покупки и открытие продажи  ", sim, per);
     }
     }
         //--- вызов функции открытия позиции на продажу
         }
      }
  }
Uma palavra de conselho. Preciso abrir um curto-circuito, por exemplo. No caso de um sinal de compra para fechar o curto e abrir o longo.
 
Artyom Trishkin:

Aqui estão as funções que irão calcular as ordens de parada corretas para qualquer tipo de ordem:

//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
   int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
   int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   return((lv==0)?sp*2:lv);
   }
//+------------------------------------------------------------------+
Obrigado, Artem! Vou dar uma olhada nisso.
 
Viachaslau Baiko:
Obrigado, Artem, vou investigar.

Seja bem-vindo. Onde quer que você precise obter preços de parada precisos, conhecendo o preço em aberto de um mercado ou ordem pendente, obtenha os preços necessários com estas funções - eles retornarão os preços já calculados para a ordem de parada necessária.

Suponha que você tenha o preço definido de um pedido pendente:
double priseSet=1,12345;
Então o preço de stop loss
int StopLoss=20; os pontos para BuyLimit serão:
double sl=CorrectStopLoss(Symbol(),OP_BUYLIMIT,priceSet,StopLoss);

A variável sl tomará o stop loss calculado corretamente para BuyLimit com os requisitos do StopLimit.

 
strongflex:
Aqui vai uma dica. Suponha que uma posição curta seja aberta. Quando um sinal de compra aparece, para fechar o curto e abrir o longo.

Verifique se há uma posição de venda aberta. Se for o caso, feche-a.

Em seguida, abra uma posição de compra.

É elementar.

 

Tenho um grande desejo de usar o mql4 para implementar tal algoritmo:

Existem dois terminais MT4 de diferentes corretores. Em um deles há um indicador "exclusivo", que não pode ser movido para outro terminal (como no Mercado).

E daí! É possível tomar as leituras dos buffers indicadores "exclusivos" e implementá-los em seu próprio indicador em seu próprio terminal?

Os recursos não funcionam de alguma forma.

Razão: