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

 
Igor Zakharov:

Corrigido... Mas ainda há um por alguma razão.



E não posso reproduzi-la no testador. Eu simplesmente não o tenho na mesma data


 

Por que não consigo conectar a biblioteca em mql4 de c+++? Aqui está meu código no C++ Visual Studio 2012. Arquivo principal. com extensão cpp (main.csr)

#define  MT4_EXPFUNC __declspec(dllexport) создал макрос чтобы не писать запись __declspec(dllexport)int __stdcall add(int a=0, int b=0)
//__declspec(dllexport)int __stdcall add(int a=0, int b=0)и так пробовал тоже
MT4_EXPFUNC int __cdecl add(int a=0, int b=0)//stdcall данная примитивная функция ничего не делает а просто возвращает значение 18
{return (18);пробовал так return 18;}

Então criei um arquivo com a extensão principal def (main.def), que tem uma lista de funções exportadas, o código se parece com isto :

LIBRARY "dllmt42"
EXPORTS
add

Depois a importei para o compilador

#import "dllmt42.dll"
int _add(int a=0, int b=0);
#import

Sem problemas após a compilação, mas quando você deixa a EA no gráfico, eu fico confuso

Chamada de função de importação não resolvida, encontrar '_add' em 'dllmt42.dll'. Total Comander vê a função assim como o próprio compilador ao arrastar o arquivo

Quem pode ajudar?

 
Alexandr Sokolov:

Corrigido... Mas ainda há um por alguma razão.

E não posso reproduzi-la no testador. Eu não tenho esse erro na mesma data

Este erro mostra que você está tentando modificar uma posição/ordem pelo preço a que fez a modificação antes...

 

Estou tentando recuperar dados indicadores em MT5 usando uma função:

//************************************************************************************************/
double Envelopes(string symb, ENUM_TIMEFRAMES TF_1, int period, int method, int shift, int price,double Deviation(ENUM_TIMEFRAMES TF_2, int kanal), int buff, int index)
{
  double buf[1];
  int handle=iEnvelopes(Symbol(), TF_1, period, method, shift, price, Deviation(TF_2, kanal), buff);
   if(handle<0)
   {
    Print("Failed to create handle ATR, Error: ",GetLastError());
    return(WRONG_VALUE);
   } else
   {
    if(CopyBuffer(handle,0,index,1,buf)<0)
    {
     Print("Failed to copy data from the indicator ATR, Error: ",GetLastError());
     return(WRONG_VALUE);
    }
   }
   return(buf[0]);
}
//************************************************************************************************/

Eu recebo um erro :


Favor informar como corrigir o código para MT5

 
Vladimir Pastushak:

Este erro indica que você está tentando modificar uma posição/ordem pelo preço ao qual já a modificou...

Não, eu já chequei muitas vezes, o problema estava na aleatoriedade de selecionar os parâmetros de entrada da MQL ao testar os produtos, que nem sempre são compatíveis - eu também corrigi isso. Mas agora recebi uma mensagem de que não há nenhuma ordem em aberto


Embora eu os tenha nos mesmos pares e prazos

 
Alexandr Sokolov:

O problema estava na aleatoriedade de selecionar os parâmetros de entrada do MQL ao testar os produtos, que nem sempre são compatíveis - eu também já corrigi isso. Mas agora recebi uma mensagem de que não há nenhuma ordem em aberto


Mas eu os tenho nos mesmos pares e prazos

Eu não sei por que minha EA não negocia.

 
Vladimir Pastushak:

Descubra porque a EA não negocia.

Ela não pode ser comercializada se os parâmetros de entrada forem escolhidos aleatoriamente para que os sinais simplesmente não ocorram. Mas você também não deve limitá-lo

 

O que se entende por"distância de congelamento comercial"? Recebido através de

SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL)

MQL4

 

Tenho novamente o erro nº 1 ao modificar. Neste EA, SL ou TP os níveis são modificados apenas em quatro blocos


1 bloco

if(OrderMagicNumber() == id_number && OrderStopLoss() != NormalizeDouble(0,_Digits) && BMod(OrderTicket()) == true)
           {
            if(OrderType() == OP_BUY)
              {
               if(OrderComment() == "1" && Bid - OrderOpenPrice() >= a1 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() + l1,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+l1,_Digits),OrderTakeProfit(),0,clrNONE);};
               if(OrderComment() == "2" && Bid - OrderOpenPrice() >= a2 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() + l2,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()+l2,_Digits),OrderTakeProfit(),0,clrNONE);};
              }
            else
              {
               if(OrderComment() == "1" && OrderOpenPrice() - Ask >= a1 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() - l1,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-l1,_Digits),OrderTakeProfit(),0,clrNONE);};
               if(OrderComment() == "2" && OrderOpenPrice() - Ask >= a2 && OrderStopLoss() != NormalizeDouble(OrderOpenPrice() - l2,_Digits)) {bol = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(OrderOpenPrice()-l2,_Digits),OrderTakeProfit(),0,clrNONE);};
              };


2 blocos

if(BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && (OrderStopLoss() == NormalizeDouble(0,_Digits) || OrderTakeProfit() == NormalizeDouble(0,_Digits)))
           {
            if(OrderComment() == "1")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1),0,clrNONE);
              }
            else if(OrderComment() == "2")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() - sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t2 : OrderOpenPrice() - t2),0,clrNONE);
              };


3 blocos

if(BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && (OrderStopLoss() == NormalizeDouble(0,_Digits) || OrderTakeProfit() == NormalizeDouble(0,_Digits)))
           {
            if(OrderComment() == "1")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1),0,clrNONE);
              }
            else if(OrderComment() == "2")
              {
               bol = OrderModify(OrderTicket(),OrderOpenPrice(),(OrderType() == OP_BUY ? OrderOpenPrice() - sl : OrderOpenPrice() + sl),(OrderType() == OP_BUY ? OrderOpenPrice() + t2 : OrderOpenPrice() - t2),0,clrNONE);
              };


4 blocos

if(BMod(OrderTicket()) == true && OrderMagicNumber() == id_number && OrderTakeProfit() == NormalizeDouble(0,_Digits))
              {
               if(MyOrders() == 1)
                 {
                  bol = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),(OrderType() == OP_BUY ? OrderOpenPrice() + t1 : OrderOpenPrice() - t1),0,clrNONE);
                 }
               else if(OrderTakeProfit() == 0)
                 {
                  bol = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),(OrderType() == OP_BUY ? OrderOpenPrice() + (OrderComment() == "1" ? t1 : t2) : OrderOpenPrice() - (OrderComment() == "1" ? t1 : t2)),0,clrNONE);
                 };


Já verifiquei tudo muitas vezes, mas não encontro nenhum erro

 
Alexandr Sokolov:

Tenho novamente o erro nº 1 ao modificar. Neste EA, SL ou TP os níveis são modificados apenas em quatro blocos



OrderStopLoss() != NormalizeDouble(0,_Digits)


Isto não é correto, também em outros exemplos

Se você colocar uma parada em 1.2356 e em um novo tique você colocar uma parada em 1.2356 novamente, você terá erro 1