Erros, bugs, perguntas - página 52

 
Não foi assim no MT4, obrigado. apenas o retirou
 

Durante os testes dos Consultores Especialistas:
Exp_TEMA.mq5, a partir do artigo: "Criação de um Consultor Especialista que negoceia com símbolos diferentes". A expressão Told[] Tnew[1]recebe os seguintes valores:
Dito[] A expressão não pôde ser avaliada
Tnew[1] Gama de matriz inválida.

E My_First_EA.mq5, do artigo: "A Step-by-Step Guide to Writing MQL5 Expert Advisors for Beginners", a expressão
New_Time[1] obtém o valor:Intervalo inválido da matriz

O que é que os valores Expressão não puderam ser avaliados, intervalo de matriz inválido, e como é que afectam os resultados da EA?

 

Dito - matriz vazia sem tamanho

Tnew[1] - fora do array, o array é descrito como Tnew[1], pelo que os seus elementos só podem ser acedidos como Tnew[0], porque o índice começa em zero.

 
Renat:

Dito - matriz vazia sem tamanho

Tnew[1] - fora do array, o array é descrito como Tnew[1], pelo que os seus elementos só podem ser acedidos como Tnew[0], porque o índice começa em zero.


Quanto ao Tnew, já mencionei noutro tópico do fórum, aparentemente, foi necessário um comentário dos criadores :)
 

Por favor, digam-me como abrir apenas um comércio por condição. Com o meu código, o terminal abre vários negócios nesta condição, mas eu só preciso de um.

       if(Buy_Signal)
        {
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);        
        }        

       if(Sell_Signal)
        {
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу                                          
         //--- отсылаем ордер
         OrderSend(mrequest,mresult);              
        }
      

O resultado é a seguinte imagem:

Como posso verificar se foi ou não feito um acordo com esta condição? Tentei desta forma, mas não funciona:

// в этом цикле поочередно перебираем все открытые позиции
   for(i=0;i<PositionsTotal();i++)
     {
      // выбираем позиции только по "нашему" инструменту
      if(Symbol()==PositionGetSymbol(i))
     ...
     }
 
AM2:

Por favor, digam-me como abrir apenas um comércio por condição. Com o meu código, o terminal abre vários negócios nesta condição, mas eu só preciso de um.

O resultado é a seguinte imagem:

Como posso verificar se foi ou não feito um acordo com esta condição? Tentei desta forma, mas não funciona:

E porquê organizar a pesquisa no laço se existe algo tão maravilhoso como PositionSelect?

Apenas verificamos a existência de posição no símbolo interessante e se for verdade, vamos beber conhaque e fumar charutos... :)

PS

Tal como entendo PositionGetString semPositionSelect não deve funcionar. Não precisamos de conhecer os símbolos de todas as poses abertas, certo?

 
Interesting:

Não há necessidade de procurar no laço quando existe uma coisa tão maravilhosa como PositionSelect?

Basta verificar a presença de uma posição na ferramenta em que estamos interessados e se voltar a ser verdade, vamos calmamente beber conhaque e fumar charutos... :)

PS

Tal como entendo PositionGetString semPositionSelect não deve funcionar. Não precisamos de conhecer os símbolos de todas as poses abertas, certo?

Este código tem em conta a presença de uma posição aberta:

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер                
     }

Mas continua a abrir posições quando a condição Buy_Signal é cumprida. O que eu quero é que antes de Sell_Signal ocorrer uma posição na Buy_Signal não volte a abrir. Estou a tentar implementá-lo desta forma:

   Buy_Signal = true;
   Sell_Signal = true;                

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер
         Buy_Signal = false;
         Sell_Signal = true;                
     }


   if(Sell_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type= ORDER_TYPE_SELL;                                       // ордер на продажу
         mrequest.price = NormalizeDouble(latest_price.bid,_Digits);           // последняя цена Bid
         mrequest.sl = NormalizeDouble(latest_price.bid + STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.bid - TKP*_Point,_Digits); // Take Profit
         OrderSend(mrequest,mresult);                                          // отсылаем ордер    
         Buy_Signal = true;
         Sell_Signal = false;                
     }
Não vai.
 
AM2:

Tal código tem em conta a presença de uma posição aberta:

Mas continua a abrir posições quando a condição Buy_Signal é cumprida. Tenho de me certificar de que antes de ocorrer a condição Sell_Signal não serão abertas mais posições por Buy_Signal. Estou a tentar implementá-lo desta forma:

Não o faz.

Porquê este código? Dificilmente se parece com o que eu quis dizer (duvido que tudo esteja correcto aí).

   if(Buy_Signal && PositionSelect(Symbol())==false)
     {
         mrequest.type = ORDER_TYPE_BUY;                                     // ордер на покупку
         mrequest.price = NormalizeDouble(latest_price.ask,_Digits);          // последняя цена ask
         mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
         mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit 
         OrderSend(mrequest,mresult);                                        // отсылаем ордер                
     }

E eu quis dizer algo do género:

Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK);

SL = NormalizeDouble(Ask - 500*_Point,_Digits);  // Stop Loss
TP = NormalizeDouble(Ask + 1500*_Point,_Digits); // Take Profit

  if(Buy_Signal)
  //Получен сигнал на market buy
  {
  
    if(!PositionSelect(_Symbol))
    //Позиции по данному символу отсутствуют
    {
    mrequest.action = TRADE_ACTION_DEAL; //Установка рыночного ордера (позиция)
    mrequest.type   = ORDER_TYPE_BUY;    //Ордер на покупку
    mrequest.magic = 18072010;          //ORDER_MAGIC
    mrequest.symbol = _Symbol;          //Инструмент
    mrequest.volume = 0.1;              //Объем в 0.1 лот
    mrequest.price = Ask;   //Цена открытия
    mrequest.sl = SL;       //Stop Loss
    mrequest.tp = TP;       //Take Profit
    mrequest.deviation = 5; //Отклонение в 5 пунктов   
    OrderSend(mrequest,mresult); //Отсылаем ордер
    }
  
  }

No mínimo, poderia ser feito num bloco

  if((Buy_Signal)&&(!PositionSelect(_Symbol)))
  //Получен сигнал market buy
  {
  ...........................................  
  }
 
Interesting:

Porquê este código em particular? Nem sequer é remotamente semelhante ao que eu queria dizer (acho que não está nada certo).

E eu quis dizer algo do género:

No mínimo, tudo pode ser feito num bloco.

if((Buy_Signal)&&(!PositionSelect(_Symbol)))
  //Получен сигнал market buy
  {
  ...........................................  
  }

Este e acima código não abre uma posição até ser fechado, mas abre novamente após o fecho na barra seguinte, se a condição for cumprida. Implementei-o desta forma:

bool BuyOne = true, SellOne = true; // только один ордер.  глобальные переменные




   if(Buy_Signal &&                                                         // покупаем если есть сигнал на покупку
      PositionSelect(Symbol())==false &&                                    // ордер закрыт
      BuyOne)                                                               // при условии на покупку ставим только один ордер
     {
      mrequest.type = ORDER_TYPE_BUY;                                       // ордер на покупку
      mrequest.price = NormalizeDouble(latest_price.ask,_Digits);           // последняя цена ask
      mrequest.sl = NormalizeDouble(latest_price.ask - STP*_Point,_Digits); // Stop Loss
      mrequest.tp = NormalizeDouble(latest_price.ask + TKP*_Point,_Digits); // Take Profit
      OrderSend(mrequest,mresult);                                          // отсылаем ордер
      BuyOne = false;                                                       // на покупку только один ордер                                                  
      SellOne = true;                                                       // меняем флаг одного ордера на продажу          
     }

Obrigado! Tive todos os vossos desejos em conta e tudo está agora a funcionar. Coloquei o Consultor Especialista para publicação. Posso fazer mais algumas alterações no código. Não há limite para a sedução))))

 
Não encontrei qualquer descrição dos códigos de resposta (Retcode) para a estrutura do MqlTradeCheckResult trade request check na documentação. Haverá algum?
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
Документация по MQL5: Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса
  • www.mql5.com
Стандартные константы, перечисления и структуры / Структуры данных / Структура торгового запроса - Документация по MQL5