Ошибка или так и надо?

 

Есть индикатор https://www.mql5.com/ru/code/8954 если скомпилировать его в новых версиях МТ4 ориентировочно после 600 билда, то он не работает никак, если достатть древний ex4 файл скомпилированный в 400-600 билдах, то все нормально работает, почему так? И может что-то можно сделать чтобы в новых версиях все тоже работало.

параметры старого ex4 http://c2n.me/jd3seW

после компиляции в свежем билде выглядит так (в примере другой индикатор) http://c2n.me/jd3wv0, т.е. добавляются новые вкладки, сам файл увеличивается в размерах примерно в двое и перестает работать.

Т.е. все запускается. в журналах эксперта видны принты которые указаны в индикаторе (типа все отрабатывает) но сам экзешник с передаваемыми параметрами не вызывается и в итоге ничего не работает.


Для сравнения вот старый ex4

Snarl
Snarl
  • 2009.05.30
  • Roffild
  • www.mql5.com
Оповещение окошечками
Файлы:
Snarl.ex4  5 kb
 
К автору индикатора уже обращались?
 
i_logic:
К автору индикатора уже обращались?
нет, попробую написать, но думаю дело не в авторе, а что-то не так с новым компилятором.
 

Думаю проблема в WinExec

Он принимает строку в стандарте ANSI, а билд 600+ передает уже строки WideChar (UTF-16).

Для запуска приложения наверное лучше использовать в данном случае CreateProcessW вместо WinExec.

 
elugovoy:

Думаю проблема в WinExec

Он принимает строку в стандарте ANSI, а билд 600+ передает уже строки WideChar (UTF-16).

Для запуска приложения наверное лучше использовать в данном случае CreateProcessW вместо WinExec.

Можете изменить это в коде? WinExec там в 3х строках, просто я не программист и что куда и с какими параметрами передавать слабо представляю (только в общих чертах понимаю что к чему). В комментария к индикатору автора оставлю решение, может я не один такой кому нужно.
 

Ну что-то вроде этого:

//+------------------------------------------------------------------+
//|                                                        Snarl.mq4 |
//|                                                          Roffild |
//|                                 http://codebase.mql4.com/ru/5670 |
//+------------------------------------------------------------------+

// Необходимо "Разрешить импорт DLL"

#property copyright "Roffild"
#property link      "http://codebase.mql4.com/ru/5670"

#property indicator_chart_window

//---------------------------------------
#import "shell32.dll"
int ShellExecuteW (int hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd);
#import
//---------------------------------------

extern color HLine_small_BID = CornflowerBlue;
extern color HLine_big_BID = SkyBlue;
extern color HLine_small_ASK = Coral;
extern color HLine_big_ASK = LightCoral;
//---------------------------------------
extern color VLine = Orchid;
extern color VLine_big = HotPink;
//---------------------------------------
// Trendline.......... no

extern int TimeOut = 15;
extern string Snarl_Title = "MetaTrader";
extern string Snarl_CMD = "\"c:\\program files\\full phat\\snarl\\snarl_cmd.exe\""; // Убедитесь что путь прописан к установленному SNARL

int start()
{
   //Print("HLine_small_BID=",HLine_small_BID,", HLine_big_BID=",HLine_big_BID,", HLine_small_ASK=",HLine_small_ASK,", HLine_big_ASK=",HLine_big_ASK,", VLine=",VLine,", VLine_big=",VLine_big,", TimeOut=",TimeOut);

   int obj_total=ObjectsTotal();
   string objname, objdesc="";

   for(int i=0;i<obj_total;i++)
   {
      objname = ObjectName(i);
      if (ObjectType(objname) == OBJ_HLINE)
      {
         //Print(TimeToStr(TimeCurrent(), TIME_DATE|TIME_SECONDS)," < ",(GetLastTime(ObjectDescription(objname)) + TimeOut));
         if (TimeCurrent() < (GetLastTime(ObjectDescription(objname)) + TimeOut)) continue;
         if (GetLastTime(ObjectDescription(objname)) > 0)
         {
            if (StringLen(ObjectDescription(objname)) > 11) objdesc = StringSubstr(ObjectDescription(objname), 0, StringLen(ObjectDescription(objname))-11);
               else objdesc = "";
         }
         else objdesc = ObjectDescription(objname);
         //Print(objname," ",ObjectGet(objname, OBJPROP_COLOR),"==",vcolor," ",ObjectGet(objname, OBJPROP_PRICE1));
         if (ObjectGet(objname, OBJPROP_COLOR) == HLine_small_BID &&
             ObjectGet(objname, OBJPROP_PRICE1) < Bid)
         {
            Print(TimeOut," \"",Snarl_Title,"\" \"",Symbol()," ",TimeToStr(TimeCurrent())," BID: ",Bid," ASK: ",Ask," Description: ",objdesc,"\"");
            snarl(TimeOut+" \""+Snarl_Title+"\" \""+Symbol()+"\n"+TimeToStr(TimeCurrent())+"\nBID: "+Bid+"\nASK: "+Ask+"\nDescription:\n"+objdesc+"\"");
            ObjectSetText(objname, objdesc + ";" + TimeCurrent());
            continue;
         }
         if (ObjectGet(objname, OBJPROP_COLOR) == HLine_big_BID &&
             ObjectGet(objname, OBJPROP_PRICE1) > Bid)
         {
            Print(TimeOut," \"",Snarl_Title,"\" \"",Symbol()," ",TimeToStr(TimeCurrent())," BID: ",Bid," ASK: ",Ask," Description: ",objdesc,"\"");
            snarl(TimeOut+" \""+Snarl_Title+"\" \""+Symbol()+"\n"+TimeToStr(TimeCurrent())+"\nBID: "+Bid+"\nASK: "+Ask+"\nDescription:\n"+objdesc+"\"");
            ObjectSetText(objname, objdesc + ";" + TimeCurrent());
            continue;
         }

         if (ObjectGet(objname, OBJPROP_COLOR) == HLine_small_ASK &&
             ObjectGet(objname, OBJPROP_PRICE1) < Ask)
         {
            Print(TimeOut," \"",Snarl_Title,"\" \"",Symbol()," ",TimeToStr(TimeCurrent())," BID: ",Bid," ASK: ",Ask," Description: ",objdesc,"\"");
            snarl(TimeOut+" \""+Snarl_Title+"\" \""+Symbol()+"\n"+TimeToStr(TimeCurrent())+"\nBID: "+Bid+"\nASK: "+Ask+"\nDescription:\n"+objdesc+"\"");
            ObjectSetText(objname, objdesc + ";" + TimeCurrent());
            continue;
         }
         if (ObjectGet(objname, OBJPROP_COLOR) == HLine_big_ASK &&
             ObjectGet(objname, OBJPROP_PRICE1) > Ask)
         {
            Print(TimeOut," \"",Snarl_Title,"\" \"",Symbol()," ",TimeToStr(TimeCurrent())," BID: ",Bid," ASK: ",Ask," Description: ",objdesc,"\"");
            snarl(TimeOut+" \""+Snarl_Title+"\" \""+Symbol()+"\n"+TimeToStr(TimeCurrent())+"\nBID: "+Bid+"\nASK: "+Ask+"\nDescription:\n"+objdesc+"\"");
            ObjectSetText(objname, objdesc + ";" + TimeCurrent());
            continue;
         }
      }
      
      if (ObjectType(objname) == OBJ_VLINE)
      {
         if (TimeCurrent() < (GetLastTime(ObjectDescription(objname)) + TimeOut)) continue;
         if (GetLastTime(ObjectDescription(objname)) > 0)
         {
            if (StringLen(ObjectDescription(objname)) > 11) objdesc = StringSubstr(ObjectDescription(objname), 0, StringLen(ObjectDescription(objname))-11);
               else objdesc = "";
         }
         else objdesc = ObjectDescription(objname);
      //Print(ObjectGet(objname, OBJPROP_COLOR)," == ",VLine,", ",TimeToStr(ObjectGet(objname, OBJPROP_TIME1)));
         if (ObjectGet(objname, OBJPROP_COLOR) == VLine &&
             ObjectGet(objname, OBJPROP_TIME1) > TimeCurrent()-60 && ObjectGet(objname, OBJPROP_TIME1) < TimeCurrent()+60)
         {
            Print(TimeOut," \"",Snarl_Title,"\" \"",Symbol()," ",TimeToStr(TimeCurrent())," BID: ",Bid," ASK: ",Ask," Description: ",objdesc,"\"");
            snarl(TimeOut+" \""+Snarl_Title+"\" \""+Symbol()+"\n"+TimeToStr(TimeCurrent())+"\nBID: "+Bid+"\nASK: "+Ask+"\nDescription:\n"+objdesc+"\"");
            ObjectSetText(objname, objdesc + ";" + TimeCurrent());
            continue;
         }
         if (ObjectGet(objname, OBJPROP_COLOR) == VLine_big &&
             ObjectGet(objname, OBJPROP_TIME1) < TimeCurrent())
         {
            Print(TimeOut," \"",Snarl_Title,"\" \"",Symbol()," ",TimeToStr(TimeCurrent())," BID: ",Bid," ASK: ",Ask," Description: ",objdesc,"\"");
            snarl(TimeOut+" \""+Snarl_Title+"\" \""+Symbol()+"\n"+TimeToStr(TimeCurrent())+"\nBID: "+Bid+"\nASK: "+Ask+"\nDescription:\n"+objdesc+"\"");
            ObjectSetText(objname, objdesc + ";" + TimeCurrent());
            continue;
         }
      }
   }
   return(1);
}

void snarl(string str)
{
   //WinExec(Snarl_CMD + " snShowMessage " + str, 0);
   ShellExecuteW (0, "open", Snarl_CMD, " snShowMessage " + str, "", 0);
}

int GetLastTime(string str)
{
   return( StrToInteger(StringSubstr(str, StringLen(str)-10)) );
}
// the end.

 Сам не проверял, поскольку SNARL не устанавливал и не пользуюсь. Но по логике работать должно.

 
elugovoy:

Ну что-то вроде этого:

 Сам не проверял, поскольку SNARL не устанавливал и не пользуюсь. Но по логике работать должно.

Да, все заработало, огромное спасибо