Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 833

 
Igor Zakharov:

Исправил... Но одна почему-то осталась



При том я не могу её воспроизвести в тестере. В этую же дату этой ошибки у меня просто нет


 

Почему не получается подключить библиотеку в mql4 из с++? Вот мой код на с++ Visual Studio 2012. Файл main. с расширением cpp (main.сср)

#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;}

Далее создал файл с main расширением def (main.def) который имеет список экспортируемых функций, выглядит код так :

LIBRARY "dllmt42"
EXPORTS
add

Далее в компиляторе произвёл импорт 

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

Компилируется проблем нет, но когда бросаешь советника на график вылазит бяка 

unresolved import function call, find '_add' in 'dllmt42.dll'. Total Comander функцию видит как и сам компилятор при перетаскивании файла 

Кто может помочь?





 

 
Alexandr Sokolov:

Исправил... Но одна почему-то осталась

При том я не могу её воспроизвести в тестере. В этую же дату этой ошибки у меня просто нет

Эта ошибка говорит о том что Вы пытаетесь модифицировать позицию/ордер по той цене по которой ранее уже делали модификацию...

 

Пробую в МТ5 получить данные Индикатора с помощью функции:

//************************************************************************************************/
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]);
}
//************************************************************************************************/

Выдаёт ошибку :


Подскажите как исправить код для МТ5

 
Vladimir Pastushak:

Эта ошибка говорит о том что Вы пытаетесь модифицировать позицию/ордер по той цене по которой ранее уже делали модификацию...

Как раз таки нет, это я уже многократно проверял, проблема оказалась в рандомности подбора входных параметров самого MQL при тестировании продуктов, которые не всегда совместимы - это я уже тоже исправил. Но теперь у меня пишет что нет ни одного открытого ордера


Хотя у меня на техже парах и таймфреймах они есть

 
Alexandr Sokolov:

Как раз таки нет, это я уже многократно проверял, проблема оказалась в рандомности подбора входных параметров самого MQL при тестировании продуктов, которые не всегда совместимы - это я уже тоже исправил. Но теперь у меня пишет что нет ни одного открытого ордера


Хотя у меня на техже парах и таймфреймах они есть

Разберитесь почему советник не торгует.

 
Vladimir Pastushak:

Разберитесь почему советник не торгует.

Он может не торговать если входные параметры рандомно подобраны так что сигналов просто не возникает. Но и ограничивать тоже не стоит

 

Что подразумевается под "дистанция заморозки торговых операций"? Получаемую через

SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL)

MQL4

 

У меня снова появилась ошибка №1 при модификации. В этом советнике уровни SL или TP модифицируются только в четырёх блоках


1 блок

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 блок

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 блок

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 блок

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);
                 };


Я уже многократно всё проверил но не могу найти ошибки

 
Alexandr Sokolov:

У меня снова появилась ошибка №1 при модификации. В этом советнике уровни SL или TP модифицируются только в четырёх блоках



OrderStopLoss() != NormalizeDouble(0,_Digits)


Это не правильно, так же и в других примерах

Если Вы ставите стоп на 1,2356 и на новом тике снова ставите стоп на 1,2356  то получите ошибку  1