Verificação da parada mínima nos EAs publicados no mercado. - página 17

 
Vladislav Andruschenko:

Meu Expert Advisor está pegando movimentos de min, então ele está batendo no servidor, mas não com 1 pip stoploss, mas com um nível normal de min + spread, mas o spread está flutuando. É por isso que a EA está batendo no servidor até devolver um spread normal.

Em outras palavras, no momento da abertura, ele verifica a parada mínima - reconstrói seus valores - e depois bate no servidor. Mas se você precisar colocar uma parada de 10 pips, você tem que esperar pelo espalhamento do min e bater no servidor.

Bater no servidor não é uma boa idéia. Você pode encontrar uma proibição de auto-comercialização. (Quem gostaria de lidar com os ataques do DDOS ao servidor por sua EA?)

Primeiro de tudo, antes de enviar um pedido, precisamos obter o spread, o nível de parada, ajustar as paradas e, se a parada for aceitável para negociação, então enviar um pedido. Se o tamanho da parada não for aceitável, então não há necessidade de incomodar ninguém. Se meu servidor tivesse sido esmagado assim, eu o teria matado...

Mas se, depois de enviar um pedido com um tamanho de parada aceitável, obtemos novamente o erro 130 (as condições de parada mudaram durante o envio do pedido), então podemos ajustar o tamanho da parada e enviar o pedido (com um tamanho aceitável de parada recém-calculada). O número de tais pedidos deve ser limitado, caso contrário, será mais uma tagarelice estúpida.

Agora vejo porque você não está autorizado a entrar no mercado.

 

é uma situação um pouco diferente aqui,

Eu não pretendo cinzelar o tempo todo.

Naturalmente, após o erro há uma verificação de erro - Slip. mas não funciona no testador.

É sobre o spread flutuante.

como escrevi acima - antes de enviar uma solicitação - os níveis de parada são corrigidos e enviados para o servidor, - o servidor retorna um erro 130 - o Expert Advisor corrige novamente o nível e envia para o servidor novamente.

e assim por diante.

O escorregamento não funciona no testador, é por isso que não há atraso.

No momento, resolvi o problema desta maneira: a parada não deve ser inferior ao nível de parada no servidor + spread + 1.

O que devo fazer se o servidor retornar o nível de parada como 0 ? i.e. flutuante ?

Opção - ajustar por erro 130 - não é uma opção - o moderador não permitirá este método.

Como sugerido anteriormente = Erro 130 - aumentar em 1 e assim por diante, até que o servidor não perca um acordo. - e não uma opção.

Amigos, obrigado pela ajuda para resolver o problema. Mas estará à procura de uma solução racional para este problema.

Obrigado a todos por sua participação.

 
Vladislav Andruschenko:

é uma situação um pouco diferente aqui,

Eu não pretendo cinzelar o tempo todo.

Naturalmente, após o erro há uma verificação de erro - Slip. mas não funciona no testador.

É sobre o spread flutuante.

como escrevi acima - antes de enviar uma solicitação - os níveis de parada são corrigidos e enviados para o servidor, - o servidor retorna um erro 130 - o Expert Advisor corrige novamente o nível e envia para o servidor novamente.

e assim por diante.

O escorregamento não funciona no testador, é por isso que não há atraso.

No momento, resolvi o problema desta maneira: a parada não deve ser inferior ao nível de parada no servidor + spread + 1.

O que devo fazer se o servidor retornar o nível de parada como 0 ? i.e. flutuante ?

Opção - ajustar por erro 130 - não é uma opção - o moderador não permitirá este método.

Como sugerido anteriormente = Erro 130 - aumentar em 1 e assim por diante, até que o servidor não perca um acordo. - e não uma opção.

Amigos, obrigado pela ajuda para resolver o problema. Mas estará à procura de uma solução racional para este problema.

Obrigado a todos por sua participação.

Em princípio, é possível forçar o usuário a inserir manualmente o fator de multiplicação de spread quando o stoplevel==0. Isto é, ao inicializar (não trocar os períodos de tempo) verifique o rochedo e, se for zero, exiba um pedido para inserir o coeficiente. Se o usuário se recusar a entrar, então use o coeficiente. 2 (spread*2) e depois aumentar ou o coeficiente ou o tamanho do stop em caso de erro 130. Se um usuário sabe como o nível de parada é calculado (pergunte ao departamento de Suporte Técnico, por exemplo), então use o coeficiente introduzido por ele, mas não se esqueça de responder a um erro de 130º aumentando o tamanho da parada (caso ela ainda apareça). Mas geralmente (já o encontrei várias vezes e aprendi empiricamente), se você usar stop=stopplavel*coeficiente+1, não ocorrerá nenhum erro. Se você não acrescentar 1 ponto, aparecem erros.

Assim, verifique no servidor MC como eles calculam o rochedo e digite o coeficiente requerido no EA. Mesmo que o moderador se recuse a inserir o coeficiente manualmente, ele será inserido automaticamente.

 

Obrigado, essa é a configuração padrão de 2 +1 pontos.

É uma boa idéia perguntar. Vou criar um formulário e deixá-lo entrar nele pessoalmente.

 

Às vezes o corretor proíbe o autotrading por alguns minutos se cerca de 20 comandos forem enviados sem pausas.
Em outras palavras, você deve modificar/fechar um monte de pedidos com uma pausa de pelo menos 300-500 ms entre os pedidos. (Mas o erro não é mais 130)

 
MqlTick MS_MqlTick;

enum EnumStopLevel
  {
   a0 = 0, // Real StopLevel
   a1 = 1, // StopLevel correction spread
   a2 = 2, // StopLevel correction 2*spread
   a3 = 3, // StopLevel correction 3*spread
   a4 = 4, // StopLevel correction 4*spread      
   a5 = 5, // StopLevel correction 5*spread         
  };
input EnumStopLevel Mode_StopLevel = 0;


//========================================== StopLevFun
double StopLevFun(int Mode_StopLevelF)
{
   double StopLL = SymbolInfoInteger(_Symbol, SYMBOL_TRADE_STOPS_LEVEL) * _Point;
 
   if(MQLInfoInteger(MQL_TESTER) && Mode_StopLevelF < 3) Mode_StopLevelF = 3; ///////////////////////// Это для тестера при модерации
 
   switch(Mode_StopLevelF)
   {
      case 0: break;
      case 1: While_SymbolInfoTick(_Symbol); StopLL = MathMax(MS_MqlTick.ask - MS_MqlTick.bid, StopLL); break;
      case 2: While_SymbolInfoTick(_Symbol); StopLL = MathMax((MS_MqlTick.ask - MS_MqlTick.bid) * 2, StopLL); break;
      case 3: While_SymbolInfoTick(_Symbol); StopLL = MathMax((MS_MqlTick.ask - MS_MqlTick.bid) * 3, StopLL); break;
      case 4: While_SymbolInfoTick(_Symbol); StopLL = MathMax((MS_MqlTick.ask - MS_MqlTick.bid) * 4, StopLL); break;
      case 5: While_SymbolInfoTick(_Symbol); StopLL = MathMax((MS_MqlTick.ask - MS_MqlTick.bid) * 5, StopLL); break;
   }
 
   return(NormalizeDouble(StopLL, _Digits) );   
}


//=========================================== While SymbolinfoTick
bool While_SymbolInfoTick(string Fsymbol)
{
   int WhTi = 0;
   
   while(!SymbolInfoTick(Fsymbol, MS_MqlTick) ) 
   {
      if(WhTi % 10 == 0) Print(Fsymbol, " >> SymbolInfoTick(Fsymbol, MS_MqlTick)= false     Try= ", WhTi);
      
      WhTi++;
      
      if(WhTi > 100) return(false);
      
      Sleep(10);
   }
   
   return(true);
}
А если вот такой вариант.
Если реал или демо, то по умолчанию выбирается вариант 0 Mode_StopLevelF, и в этом случае возвращается реальный стоплевел.
Но можно выбрать и коррекцию стоплевела спредом, с разным коэффициентом. При этом если стоплевел будет больше чем спред, то будет учитываться стоплевел.
А для тестера, при модерации, выбирается всегда режим не ниже 3 Mode_StopLevelF, в этом случае стоплевел будет больше спреда в 3 раза и больше.
П.С. Как пишет разработчик SymbolInfoTick  предпочтительнее чем SymbolInfoDouble для Ask и Bid.
https://www.mql5.com/ru/docs/marketinformation/symbolinfodouble
 
Vladislav Andruschenko:

Olá a todos, amigos!

uma característica do Marketplace: precisamos verificar todos os valores para a parada mínima.

Se o valor da variável for menor que a min-stop, então atribua uma min-stop, para que não haja erro 130.

Atualmente 90% dos corretores têm spread flutuante e min STOP e rendimento 0.

Há uma construção de código que atribui todas as variáveis à parada mínima.

Mas não funciona mais no mercado, porque agora o minstop = 0 em todos os lugares,

Quem está lidando com este problema?

Oi Vladislav, leia o problema que eu também encontrei e decidi se o nível de parada flutuante retorna um valor 0 ou próximo a zero, então use sinais inversos para fechar.

Você acha que esta solução está bem?

 
oi, o sinal de fechamento está invertido, no sentido de paradas virtuais?
 
Sim, mas eu tenho uma idéia melhor, então eu farei isso. Por exemplo, se o cálculo automático dos níveis de parada pela ATR retornou zero ou próximo a zero, que é menor que o valor do spread médio, então usamos os dados anteriores até que os novos dados apareçam com a abertura do próximo pedido. Isto é melhor do que sinais inversos.
 
Se você fizer o sistema - então está tudo bem, mas a questão era sobre verificar no mercado, infelizmente o erro 130 impede que o produto vá mais longe