Perguntas de Iniciantes MQL4 MT4 MetaTrader 4 - página 112

 
Николай Цепелев:

Olá. Escrevi em minha EA o cálculo do lote desta forma:

lot=NormalizeDouble(AccountBalance()*risk/(SL*MarketInfo(Symbol(),MODE_TICKVALUE)),2);

O objetivo é obter o tamanho de lote correto independentemente da moeda da conta e do par para o risco dado e parar a perda. Risk é definido como um percentual de perdas quando o Stop Loss é acionado. Stop Loss SL em pips (onde pips é a menor mudança possível no preço do par). Vou iniciar esta EA com uma conta real. Mas eu tenho minhas dúvidas. Se alguém de programadores mais experientes pudesse me dizer quais erros podem ocorrer, eu ficaria muito grato.
Primeiro o testador de estratégia. Depois temos uma conta de demonstração. E só então a conta real. Para verificar a fórmula, escreva um roteiro. Ou simplesmente calculá-lo em um pedaço de papel. Eu tomei balanço=100, risco=0,1 SL=100, Tick=0,00001 Lote=100*0,1 / (100*0,00001) = 10 / 0,001 = 10000 lote a mais do que o balanço? Devemos considerar a vantagem?
 
STARIJ:
Primeiro testador de estratégia. Em seguida, uma conta demo. E só então um de verdade. Para verificar a fórmula, escreva um roteiro. Ou simplesmente calculá-lo em um pedaço de papel. Eu tomei balanço=100, risco=0,1 SL=100, Tick=0,00001 Lote=100*0,1 / (100*0,00001) = 10 / 0,001 = 10000 lote a mais do que o balanço? Devemos considerar a vantagem?

MarketInfo(Symbol(),MODE_TICKVALUE)) não retorna o tamanho mínimo do tick. Está escrito na ajuda:

Tamanho da mudança mínima do preço do instrumento na moeda do depósito.


Mas na verdade, ele retorna o valor da mudança mínima do preço do símbolo na moeda do depósito de 1 lote do contrato.


Em seu exemplo,MarketInfo(Symbol(),MODE_TICKVALUE)) retornará 1. E então tudo está correto. Experimentei em contas reais em dólar e rublo e funciona. Aqui está o roteiro que eu usei para verificá-lo:

#Copyright "Copyright 2016, MetaQuotes Software Corp.

#link da propriedade "https://www.mql5.com"

#propriedade versão "1.00"

#propriedade rigorosa

#property show_inputs

risco duplo externo=0,10;

sl=1000;

//+------------------------------------------------------------------+

//| Função de início do programa Script |

//+------------------------------------------------------------------+

nulo OnStart()

{

Alert(NormalizeDouble(AccountBalance()*risk/(sl*MarketInfo(Symbol(),MODE_TICKVALUE),2)))

}

//+------------------------------------------------------------------+

Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
Открой новые возможности в MetaTrader 5 с сообществом и сервисами MQL5
  • www.mql5.com
Задавайте вопросы по техническому анализу, обсуждайте торговые системы и улучшайте свои навыки программирования торговых стратегий на языке MQL5. Общайтесь и обменивайтесь опытом на форуме с трейдерами всего мира и помогайте ответами новичкам — наше сообщество развивается вместе с вами. Библиотеки: Black or White Text Black or White Text...
 

Você está certo. A verificação com um roteiro é mais rápida e mais confiável

//+------------------------------------------------------------------+ 
//| Расчет лота                                                      | 
//+------------------------------------------------------------------+ 
#property strict
#property show_inputs
extern double risk=0.10;
extern int    sl  =100;
void OnStart() 
{ 
   Alert(MarketInfo(Symbol(),MODE_TICKVALUE), "   ",NormalizeDouble(AccountBalance()*risk/(sl*MarketInfo(Symbol(),MODE_TICKVALUE)),2));
}
 
Николай Цепелев:
Seu roteiro ocupa 19 cm de altura na tela, o meu tem 8,1 cm - metade da altura. E a cor é diferente
 

Também precisamos fazer a precisão na função NormaliseDouble depender do lote mínimo permitido. Se você passar um lote para a função OrderSend, por exemplo, 0,11, e a ferramenta for comercializada apenas com lotes múltiplos de 0,1, haverá um erro.

 

Não consigo entender por que as negociações abertas não são apagadas de uma só vez, ou seja, a EA apaga algumas delas, mas a ordem de erro 4108, a ordem de mercado não pode ser apagada várias vezes, e só então as apaga.

  int start()                                     
  {
  
  while(!IsStopped())     
      {               

Refreshrates();

  
   if(cont==true&&NormalizeDouble(AccountProfit(),2)>=0)
    {
     for(i=1; i<=OrdersTotal(); i++)       
        { RefreshRates(); 
         if(OrderSelect(i-1,SELECT_BY_POS)==true
           {                                    
              while(OrderType()==OP_BUYLIMIT) 
              {
               res=false;
               res=OrderDelete(OrderTicket());
               if(res==true)
               break;
               }
              while(OrderType()==OP_BUY)
              {
               res=false;
               res=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symb,MODE_BID),Slippage);  
               if(res==true)
               break;
              }
              while(OrderType()==OP_SELLLIMIT) 
              {
               res=false;
               res=OrderDelete(OrderTicket());
               if(res==true)
               break;
              }
              while(OrderType()==OP_SELL)
              {
               res=false;     
               res=OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symb,MODE_ASK),Slippage);
               if(res==true)
               break;
              }     
           }  
         }
}
}  
 
Yevgen Butov:

Não consigo entender por que as negociações abertas não são apagadas de uma só vez, ou seja, a EA apaga algumas delas, mas a ordem de erro 4108, a ordem de mercado não pode ser apagada várias vezes, e só então as apaga.

Esta página explica como excluir. Você tem 2 erros.

 
Boa tarde. Estou pedindo ajuda. Eu pesquisei a NET e o fórum. Estou testando o Expert Advisor no modo padrão, tudo está bem... Sem erros ou avisos. Eu fiz o download dos dados do tick e adicionei. (Eu fiz tudo como descrito aqui - Como testar Expert Advisors com 99% de qualidade - fácil, gratuito, legal) e aqui - "Como obter 99% de qualidade de simulação no Testador de Estratégia Metatrader 4") Na partida, erro constante 'array fora do alcance em 'expert1.0.mq4' (69,25)... Entendo que se trata de uma série. Eu não sei o que fazer. Mas como tudo está bem no modo padrão... Por favor, ajude
 
qroner:
Na partida, há uma matriz de erros constante fora do alcance em 'expert1.0.mq4' (69,25)... Eu entendi que se tratava da matriz. Eu não sei o que fazer.

Necessidade de ver o código, ou um pedaço dele, manipulando esta matriz.

Telepatas, descansem hoje.

 
Konstantin Nikitin:

Você precisa olhar o código ou um pedaço de código que lida com a matriz.

Telepatas, descansem hoje.

void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8]){
ArrayInitialize(_Mas, 0);
int Ticket=-1;
for(int pos=OrdensTotal()-1; pos>=0; pos--){
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol&&&
OrderMagicNumber()==_Magic && OrderTicket()!=Ticket){
Ticket=OrderTicket();
switch(OrderType()){
case 0:{_Mas[0]++;_Mas[6]++;break;}
case 1:{_Mas[1]++;_Mas[6]++;break;}
case 2:{_Mas[2]++;_Mas[7]++;break;}
case 3:{_Mas[3]++;_Mas[7]++;break;}
case 4:{_Mas[4]++;_Mas[7]++;break;}
case 5:{_Mas[5]++;_Mas[7]++;break;}
}
}
}

}

Aqui está a função.

Apenas pensei que o problema não estava no código, pois não há erros no modo padrão.