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

 
Vitaly Muzichenko:

Попробуйте закомментировать строку, пусть работает одна функция


интересно так то если знать как) 
 
Rustam Bikbulatov:

интересно так то если знать как) 
знать ничего не нужно, Я это показал в коде //
 
Rustam Bikbulatov:

Привет еще раз. Подскажите как изменить код известного программиста. В данный момент эта сова закрывает примерно одну сделку раз в секунду. Хотелось бы изменить на закрытие сделок мгновенно как пересечет определенную прибыль в независимости от положительных и отрицательных сделок.

В журнал пишутся какие-либо сообщ. об ошибках ?

Можете задержки внутри ClosePosBySelect уменьшить до более разумных величин. Там на закрытие каждого ордера делается несколько попыток, и каждый раз в случае неудачи висит Sleep.

Кстати и восстановление после ошибок можно делать оптимальней (видимо с момента созданий сих функций MT научился выдавать более разные код чем ERR_CONTEXT_BUSY)

 
Rustam Bikbulatov:

интересно так то если знать как) 
Можете заменить те две, на одну вот эту, она у меня работает отменно, но многое зависит от скорости исполнения ордеров вашим ДЦ.
 
Maxim Kuznetsov:

В журнал пишутся какие-либо сообщ. об ошибках ?

Можете задержки внутри ClosePosBySelect уменьшить до более разумных величин. Там на закрытие каждого ордера делается несколько попыток, и каждый раз в случае неудачи висит Sleep.

Кстати и восстановление после ошибок можно делать оптимальней (видимо с момента созданий сих функций MT научился выдавать более разные код чем ERR_CONTEXT_BUSY)

Пробовал вообще убрать Sleep но отличаются чем.
 
Vitaly Muzichenko:
Можете заменить те две, на одну вот эту, она у меня работает отменно, но многое зависит от скорости исполнения ордеров вашим ДЦ.

Это полноценная сова или часть кода от чего то?
 

Господа специалисты помогите!!! Третий день голову ломаю над следующей проблемой. Использовал в советнике стандартную (где не смотрел везде ее используют) функцию считывания файла из интернэта с помощью wininet.dll для последующего разбора:


string ReadHTML()

{

   if(!IsDllsAllowed())

     {

       Alert("Необходимо в настройках разрешить использование DLL");

       return("");

     }

   int rv = InternetAttemptConnect(0);

   if(rv != 0)

     {

       Alert("Ошибка при вызове InternetAttemptConnect()");

       return("");

     }

   int hInternetSession = InternetOpenW("Microsoft Internet Explorer",  0, "", "", 0);

   if(hInternetSession <= 0)

     {

       Alert("Ошибка при вызове InternetOpenW()");

       return("");         

     }

   int hURL = InternetOpenUrlW(hInternetSession,URL, "", 0, 0, 0);

   if(hURL <= 0)

     {

       Alert("Ошибка при вызове InternetOpenUrlW()");

       InternetCloseHandle(hInternetSession);

       return("");         

     }      

   int cBuffer[256];

   int dwBytesRead[1]; 

   string TXT = "";

   while(!IsStopped())

     {

       bool bResult = InternetReadFile(hURL, cBuffer, 1024, dwBytesRead);

       if(dwBytesRead[0] == 0)

           break;

       string text = "";   

       string text0= "";   

       for(int i = 0; i < 256; i++)

         {

              text0= CharToStr((char)(cBuffer[i] & 0x000000FF));

              if (text0!="\r") text = text + text0;

              else dwBytesRead[0]--;

              if(StringLen(text) == dwBytesRead[0]) break;

              

              text0= CharToStr((char)(cBuffer[i] >> (8 & 0x000000FF)));

              if (text0!="\r") text = text + text0;

              else dwBytesRead[0]--;

              if(StringLen(text) == dwBytesRead[0]) break;

              

              text0= CharToStr((char)(cBuffer[i] >> (16 & 0x000000FF)));

              if (text0!="\r") text = text + text0;

              else dwBytesRead[0]--;

              if(StringLen(text) == dwBytesRead[0]) break;


              text0= CharToStr((char)(cBuffer[i] >> (24 & 0x000000FF)));

              if (text0!="\r") text = text + text0;

              else dwBytesRead[0]--;

              if(StringLen(text) == dwBytesRead[0]) break;

              

         }

       TXT = TXT + text;

       Sleep(1);

     }

   InternetCloseHandle(hURL);

   InternetCloseHandle(hInternetSession);

   

   return(TXT);

}


Все ок, только раз прочитав сайт, на котором впоследствии обновляется информация, при последующем обращении к данной функции (с периодом от 1 минуты и реже, хотя сайт обновляется чаще) выдает тот же сайт без изменений(как был прочитан первый раз). Перезапуск советника не спасает, как был прочитан файл при первом обращении после запуска терминала, так его и выдает. Обновляется только если вручную открыть Internet Explorer с нужным сайтом(соответственно с обновленной информацией) функция начинает считывать эту обновленную информацию, ну и дальше замораживается уже эта конфигурация сайта, или при перезапуске терминала МТ4 (и тоже, как первый раз после перезапуска прочитала, так дальше и выдает). Подозреваю, что как то связано с параметрами InternetOpenW или InternetOpenUrlW, по умолчанию везде нули стоят, но нигде не могу найти внятного описания, да и у других же как-то работает(функцию брал из советников ретранслирующих новости с сайтов в терминал). Да, в настройках терминала "Разрешить WebRequest для..." для нужного сайта сделал.

 

Добрый день.

Уже оперативка дымится: проблема возникла в советнике, после взятия TP или SL, опять открывает ордер!

Не могу придумать условие при котором советник привязывался только ко 2 му бару после появления сигнала от индикатора

или же , если сработал TP или SL он бы ждал нового сигнала, но только при смене сигнала индикатора.


void OnTick()

{

  uptr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 0, n), 4);

  dntr = NormalizeDouble(iCustom(NULL, 0, "Slope Direction Line", period,  method, price, 1, n), 4); 

  

if(DN_Trend()==true)

{

  if(CountSell() == 0 && Bid < dntr && Open[3] < dntr && Close[3] < dntr)

  { 

   ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "Sloper", Magic, 0, Red);

      if (ticket > 0)

      {

         SL = NormalizeDouble(Bid + StopLoss*Point, Digits);

         TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);

         

         if (OrderSelect(ticket, SELECT_BY_TICKET))

         if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

           Print("Ошибка на продажу");

      }

  }

 
d1w4m3:

Добрый день.

Уже оперативка дымится: проблема возникла в советнике, после взятия TP или SL, опять открывает ордер!

Не могу придумать условие при котором советник привязывался только ко 2 му бару после появления сигнала от индикатора

или же , если сработал TP или SL он бы ждал нового сигнала, но только при смене сигнала индикатора.

Если последняя закрытая позиция имеет тип, такой же, какой поступил сигнал, и если эта позиция была закрыта по одному из стоп-приказов, то не открывать позицию.
 
Artyom Trishkin:
Если последняя закрытая позиция имеет тип, такой же, какой поступил сигнал, и если эта позиция была закрыта по одному из стоп-приказов, то не открывать позицию.


Спасибо за ответ, но я только как пару недель начал учиться, как это в коде реализовать, или подскажите где почитать пожалуйста. Или по Игорю Киму сделать?

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

Причина обращения: