Aprender e escrever juntos em MQL5 - página 24

 

O que é que esta função faz que é clara para todos?

int OpenSell(double volume,int slippage=10,string comment="Open Short EUR/USD (Sell)",int magic0=102406)

{

MqlTradeRequest my_trade;

MqlTradeResultado meu_resultado_de_comércio;

my_trade.action=TRADE_ACTION_DEAL;

my_trade.symbol=Symbol();

my_trade.volume=NormalizeDouble(volume,1);

my_trade.price=NormalizeDouble(Bid,_Digits);

my_trade.sl=NormalizeDouble(Bid+StopLoss*_Point,_Dígitos);

my_trade.tp=NormalizeDouble(Bid-TakeProfit*_Point,_Dígitos);

my_trade.deviation=slippage;

my_trade.type=ORDER_TYPE_SELL;

my_trade.type_filling=ORDER_FILLING_AON;

my_trade.comment=comment;

my_trade.magic=magic;


ResetLastError();

if(OrderSend(my_trade,my_trade_result))

{

time_oc=TimeLocal();

md=0;

Print( "Operation result code - " ,my_trade_result.retcode);

}

senão

{

Print("Operation result code - ",my_trade_result.retcode);

Print("Order open error = ",GetLastError()));

}

return(0);

}

No procedimento OnTick()

...

OpenSell(Lots,10, "EUR/USD (Sell)",102406);

...

Logo no início:

StopLoss duplo=250,

TakeProfit=1400;

Lotes duplos externos = 0,1;

Por que raio é que os resultados dos testes custam 220 dólares?

<DATA> <BALANÇO> <EQUIDADE> <NÍVEL DE MARGEM

01,01,2010 0 :00:00 10000 10000 0

11,01,2010 2 :57:00 9779,29 9841,92 6827

15,01,2010 16:00:00 9829,8 9941,9 6857

22,01,2010 14:32:00 10124,1 10135,9 7167

26,01,2010 2 :14:00 10048,6 10048,6 0

26,01,2010 4 :06:00 10048,6 10038,4 7099

27,01,2010 21:12:00 10188,5 10188,5 0

29,01,2010 2 :16:00 10188,5 10308 7346

29,01,2010 7 :14:00 10188,5 10277,4 7324

04,02,2010 22:05:00 10418,63 10480,83 7592


Se eu estiver errado, espetar-me no nariz.

Não vos deixarei ver a EA inteira. A função na compra é semelhante...

Encerro a minha posição com ordem contrária.

 

Muito bem. Tenho andado a gritar de cabeça baixa. Apenas a aprendizagem da língua. Se eu ofendi alguém, peço desculpa. Vou trabalhar e procurar o problema. Provavelmente já o fiz eu próprio, mas quero realmente aprender a fazer bons EAs usando mql5. É um sistema muito bom, mas . Tenho problemas com isso até agora.

Embora eu tenha 20 Consultores Especialistas em mql4 sem quaisquer problemas.

 
Khomtchenko:
...
Seria melhor dar o histórico da transacção para o período em questão, em vez destes números desconhecidos. Então talvez seja mais claro de onde veio a perda.
 

Comecei a estudar a secção "Operações de arquivo" pouco a pouco. Sabe se há alguns tutoriais sobre como trabalhar com ficheiros na MQL5?

 

Qual é a forma correcta de eliminar todas as encomendas com um determinado modo?

Tenho duas funções para isto, check_orders checks_orders para encomendas com um determinado modo, e remove_sl elimina as encomendas:

void remove_sl()
     {
      int counter01;
      ulong counter02;
      while(check_orders()==true)
        {
         for(counter01=0; counter01<OrdersTotal(); counter01++)
           {
            counter02=OrderGetTicket(counter01);
            if(OrderGetInteger(ORDER_MAGIC)!=magick)
               continue;
            remove_request.action=TRADE_ACTION_REMOVE; remove_request.order=counter02;
            if(OrderCheck(start_request,check_result)==true)
               OrderSend(start_request,trade_result);
           }
        }
     }



bool check_orders()
     {
      int counter01;
      bool order_exist=false;
      for(counter01=0; counter01<OrdersTotal(); counter01++)
        {
         OrderGetTicket(counter01);
         if(OrderGetInteger(ORDER_MAGIC)==magick)
           {
            order_exist=true;
            break;
           }
        }
      return(order_exist);
 

O problema é que na revista da EA estas linhas aparecem:

2011.05.11 21:40:19 Comércios '726238' : não conseguiu cancelar a encomenda #4375237 comprar 0,00 a 0,00000 [Pedido inválido]
Ou seja, há pedidos redundantes ao servidor de comércio para eliminar a ordem de eliminação do pedido que já foi enviado.

 

Penso que tenho um problema com o fecho e a abertura de posições.

De alguma forma, em vez de ter uma posição para 0,1 lote, tenho de facto vários lotes. Aparentemente, as posições de um símbolo sobrepõem-se e o volume da posição cresce. Esta é a única forma de explicar os problemas acima mencionados com grandes valores de paragem e grande diferença nos testes. Significa que estou a analisar a presença de comércios abertos incorrectamente ou a fechar os trilhos incorrectamente.

Este é o procedimento que utilizo para determinar se existe uma posição aberta através de um símbolo:

int Total()

{

contar=0;

para (i=0; i<=PosiçõesTotal(); i++)

{

se (PositionGetSymbol(i)==_Symbol) {count++;}

}

devolução(contagem);

}

Naturalmente, a função retorna 0 ou 1.

Utilizo a seguinte entrada para abrir encomendas

se (Total()<1)

{

se (# alguma verificação nos indicadores#) OpenBuy(Lots,10, "EUR/USD (Comprar)",102406);

se (#some check on indicators#) OpenSell(Lots,10, "EUR/USD (Sell)",102406);

}

Abro a compra e venda de produtos com a aparência:

int OpenSell(volume duplo,int slippage=10,string comment="Open Short EUR/USD (Sell)",int magic0=102406)

{

MqlTradeRequest my_trade;

MqlTradeResultado meu_resultado_de_comércio;

my_trade.action=TRADE_ACTION_DEAL;

my_trade.symbol=Symbol();

my_trade.volume=NormalizeDouble(volume,1);

my_trade.price=NormalizeDouble(Bid,_Digits);

my_trade.sl=NormalizeDouble(Bid+StopLoss*_Point,_Dígitos);

my_trade.tp=NormalizeDouble(Bid-TakeProfit*_Point,_Dígitos);

my_trade.deviation=slippage;

my_trade.type=ORDER_TYPE_SELL;

my_trade.type_filling=ORDER_FILLING_AON;

my_trade.comment=comment;

my_trade.magic=magic;


ResetLastError();

if(OrderSend(my_trade,my_trade_result))

{

time_oc=TimeLocal();

md=0;

Print( "Operation result code - " ,my_trade_result.retcode);

}

senão

{

Print("Operation result code - ",my_trade_result.retcode);

Print("Order open error = ",GetLastError()));

}

return(0);

}

Encerro os negócios no procedimento principal da mesma forma:

se (Total()>0) TryToClose();

TryToClose é assim:

int TryToClose()
{
para (i=0; i<=PosiçõesTotal(); i++)
{
se (PositionGetSymbol(i)==_Symbol)
{
se (PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
if(# alguma verificação de indicador#) OpenSell(Lots,10, "EUR/USD (Sell)",102406)
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
if(# alguma verificação de indicador#) OpenBuy(Lots,10, "EUR/USD (Comprar)",102406);
}
}
return(0);

}

O indicador verifica se deve haver uma posição de Compra e se há uma posição de Venda, então fazemos uma Posição de Compra.

Onde cometi um erro. Porque é que estou a aumentar as minhas posições.

 
Khomtchenko:

Inserir o código através do botão SRC

Будет читабельнее
Sabe a diferença entre uma encomenda MT4 e uma encomenda MT5?
 

Em mql4 as encomendas são ou comerciais ou pendentes.

Em mql5 uma encomenda é uma transacção pendente. A entrada no mercado é uma abertura de uma posição. Quando a ordem é accionada, é aberta uma posição. Só pode haver uma posição para um símbolo, e pode haver tantas encomendas quantas quisermos.

Спасибо за подсказку
 

Todos me insinuam sempre para ser estúpido. Posso ser idiota. Bem, encontre os meus erros para que os possa corrigir.

 
Khomtchenko:

Estou a receber uma espécie de pista de estupidez. Posso ser estúpido. Bem, encontrar os meus erros para que eu os possa corrigir.

Não estou a insinuar nada, apenas passei a correr e perguntei qual era a razão, não sei o vosso nível de formação.

Estou aqui há muito tempo, já formei uma opinião sobre muitas pessoas (cada um é forte à sua maneira), ainda não o conheço, por isso não vou insinuar nada.


Não vejo o panorama geral da estratégia. A julgar pelo facto de estar a passar pelas posições, a estratégia é multi-moeda.

Mas prescreveu apenas uma ferramenta, se a ferramenta é uma só, porquê percorrer as posições?

Se conhece o instrumento, não precisa de procurar em todas as posições para as encontrar, só precisa de utilizar esta função:

bool  PositionSelect(
   string  symbol     // имя инструмента
   );
Razão: