[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 259

 
paladin80:
Должен закрыться по стоп-лоссу. Форекс открывается в 00:00 по гринвичу.

Но закроется не по цене стопЛосса, а по первой цене, которая может быть намного ниже стопЛосса! А тейкПрофит закрывают точно. Потому лучше не оставлять со стопЛоссом, а ещё лучше не оставлять позиций на выходные!
 

Как можно узнать адрес своей пользовательской функции? То есть если у меня по листингу

int start()
...
   int num=myFunc()//вызов функции
...
int myFunc()//описание моей функции
 {
    ...
 }

 то как узнать адрес myFunc? Нужно для того, чтобы понять как узнать адрес WndProc (описываю пользовательской функцией) для передачи далее в параметр класса.

 
paladin80:
Должен закрыться по стоп-лоссу. Форекс открывается в 00:00 по гринвичу.

Далеко не факт, вполне может закрыться и по первой котировке. Надо читать документы, а в них ДЦ пишут, что им вздумается.
 
gyfto:

Как можно узнать адрес своей пользовательской функции? То есть если у меня по листингу

 то как узнать адрес myFunc? Нужно для того, чтобы понять как узнать адрес WndProc (описываю пользовательской функцией) для передачи далее в параметр класса.


Кто сказал, что у нее вапще есть адрес? это же MQL4-функция: она даже не скомпилирована в прямом смысле слова, а прогоняется через интерпретатор во время выполнения программы.
 

 Почему не эксперт не модифицирует ордера?

Вот функция:

//+-------------------------------------------------------------------------------------+
//| Первоначальная установка TP и SL                                                    |
//+-------------------------------------------------------------------------------------+
void OrdersModifyer(int ticket)
{ 
   double SL, TP;
    
   if (OrderType() == OP_SELL || OrderType() == OP_SELLSTOP)
   { 
       SL = ND(OrderOpenPrice() + i_sl * pt);
       TP = ND(OrderOpenPrice() - i_tp * pt); 
       
       if (SL - Ask <= g_stopLevel)
           SL = Ask + g_stopLevel;
       if (Ask - TP <= g_stopLevel)
           TP = Ask - g_stopLevel;
       
       if (!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0, Red))
       {
          Print ("Ошибка модификации ордера ", OrderType(), " - ", GetLastError());
          return(false);
       }
   }
       
   if (OrderType() == OP_BUY || OrderType() == OP_BUYSTOP)
   { 
       SL = ND(OrderOpenPrice() - i_sl * pt);
       TP = ND(OrderOpenPrice() + i_tp * pt);
       
       if (Bid - SL <= g_stopLevel)
           SL = Bid - g_stopLevel;
       if (TP - Bid <= g_stopLevel)
           TP = Bid + g_stopLevel;
       
       if (!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0, Red))
       {
          Print ("Ошибка модификации ордера ", OrderType(), " - ", GetLastError());
          return(false);
       }
   }
}

  Вызываю в старте так:

 for (g = OrdersTotal() - 1; g >= 0; g--)
   {
       if (!OrderSelect(g,SELECT_BY_POS)) continue;
       if (i_magic != -1) if (OrderMagicNumber() != (i_magic)) continue;
       if (OrderSymbol() != Symbol()) continue;
       
       ticket = OrderTicket();
       type = OrderType();
       
       if (i_sl != 0 || i_tp != 0)
       {
          if (OrderStopLoss() == 0 && OrderTakeProfit() == 0)
          {
             OrdersModifyer(ticket);
          }
       }
   }
 
TarasBY:

Cпасибо за помощь.
 
alsu:

Кто сказал, что у нее вапще есть адрес? это же MQL4-функция: она даже не скомпилирована в прямом смысле слова, а прогоняется через интерпретатор во время выполнения программы.


Вот где собака зарыта. Тогда мне просто жаль потраченных 2-3 недель из-за выбора самостоятельного оконного интерфейса для робота в рамках только MQL4+WinAPI без самописных dll. Жаль что я не понял этого раньше, жаль своего кода и своих наработок.

Подытоживаем. Перекрывающееся (т.е. не дочернее) окно без выноса кода в свою dll создать невозможно, потому что при описании WNDCLASS (или WNDCLASSEX) 

typedef struct tagWNDCLASSEX {//    это с MSDN
  UINT      cbSize;
  UINT      style;
  WNDPROC   lpfnWndProc;//<-
  int       cbClsExtra;
  int       cbWndExtra;
  HINSTANCE hInstance;
  HICON     hIcon;
  HCURSOR   hCursor;
  HBRUSH    hbrBackground;
  LPCTSTR   lpszMenuName;
  LPCTSTR   lpszClassName;
  HICON     hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;

 в указанных стрелочкой строках при упаковке структуры в интовый массив

lpwcx[0]=0x30;//cbSize//    это на MQL4
lpwcx[1]=0x0A23;//style
//lpwcx[2]=lpfnWndProc;<-
lpwcx[3]=0;//cbClsExtra
lpwcx[4]=0;//cbWndExtra
lpwcx[5]=GetModuleHandleA(lpModuleName);//hInstance
lpwcx[6]=LoadIconA(hInstance,IDI[0]);//hIcon
lpwcx[7]=LoadCursorA(hInstance,IDC[0]);//hCursor
lpwcx[8]=GetStockObject(WHITE_BRUSH);//hbrBackground
lpwcx[9]=StrStrA(lpszMenuName,lpszMenuName);
lpwcx[10]=StrStrA(lpszClassName,lpszClassName);
lpwcx[11]=0;//hIconSm
//передаём структуру в упакованном интовом массиве и регистрируем класс
atom=RegisterClassExA(lpwcx[12]);

 передаётся адрес оконной процедуры, т.е. обработчика мыши и клавиатуры для этого окна. Оконную процедуру на MQL4 можно реализовать как пользовательскую функцию, но адрес её получить в рамках интерпретатора невозможно, поэтому и передавать нечего. Максимум, что возможно на MQL4 - использовать стандартные оконные классы, но они подразумевают в себе использование только в качестве дочерних окон. Если говорить простым языком, созданное индикатором такое окно нельзя будет ухватить мышкой и вывести за границы терминала (т.к. это будет дочернее окно), в то время как перекрывающееся окно за границы терминала вывести можно. Дочерние же окна на стандартных оконных классах уже реализованы на mt4gui.dll, если кому надо. А вот перекрывающееся со своим обработчиком мыши и клавиатуры - невозможно.

Просьба модераторам вывести этот диалог и все связанные сообщения в отдельную тему типа "как создать окно на MQL4", чтобы другие не наступали на те же грабли и могли найти её в поисковике.

 
здравствуйте, скачал metatreider4. не всплывает вкладка торговля ,как это было в демо версии(((. подскажите в чем дело??????
 

Добрый день!

Может кто знает брокер считывает ip адрес компьютера трейдера  только в режиме online или есть техническая возможность также выгрузить историю из какой-нибудь папки в МТ4?

 

Решил реализовать "горячие клавиши" (без использования управляющих клавиш типа Ctrl, Alt, Shift). Но код не работает.

#property indicator_chart_window
#import "user32.dll"
bool RegisterHotKey(int hWnd, int id, int fsModifiers, int vk);
bool PeekMessage (int& lpMsg[7], int hWnd, int wMsgFilterMin, int wMsgFilterMax, int wRemoveMsg);
bool UnregisterHotKey (int hWnd, int id);
#import

extern string s0="идентификатор горячей клавиши";
extern int id;
extern string s1="код клавиши (список см. winuser.h)";
extern int vk;
extern string s2="номер окна (от нуля до WindowsTotal()-1)";
extern int aWindowNumber;
bool PM;

int init()
  {
   ObjectCreate("Smile",OBJ_LABEL,aWindowNumber,0,0);
   ObjectSet("Smile",OBJPROP_XDISTANCE,0);
   ObjectSet("Smile",OBJPROP_YDISTANCE,0);
   ObjectSetText("Smile", StringSetChar("", 0, 75), 50, "WingDings", Red);
   return(RegisterHotKey(WindowHandle(Symbol(), Period()), id, 0, vk));
  }

int deinit()
  {
   ObjectDelete("Smile");
   WindowRedraw();
   return(UnregisterHotKey(WindowHandle(Symbol(), Period()), id));
  }

int start()
  {
   int lpMsg[7];
   /*
   Структура lpMsg для WM_HOTKEY:
   0 - хэндл окна//HWND(MSDN)//int(MQL4)
   1 - WM_HOTKEY (0x0312)//UINT(MSDN)//int(MQL4)
   2 - заданный id//WPARAM(MSDN)//int(MQL4)
   3 - млардшее слово - ноль (модификатор, - не задаём), старшее - код виртуальной клавиши//LPARAM(MSDN)//int(MQL4)
   4 - время//DWORD(MSDN)//int(MQL4)
   5 - координата х мышки//структура POINT. LONG(MSDN)//int(MQL4)
   6- координата у мышки//LONG(MSDN)//int(MQL4)
   */
   PM=PeekMessage(lpMsg, WindowHandle(Symbol(), Period()), 0, 0, 1);//1 = PM_REMOVE
   if (lpMsg[1]==0x0312){
      if(lpMsg[2]==id){
         switch(StringGetChar(ObjectDescription("Smile"),0)){
            case 74 : ObjectSetText("Smile", StringSetChar("", 0, 75), 50, "WingDings", Red);
            case 75 : ObjectSetText("Smile", StringSetChar("", 0, 74), 50, "WingDings", Red);
            }
      }
   }
   return(0);
  }

 Отчего он может не работать? По идее, смайлик должен меняться. Я задавал 81 (код клавиши Q), но там можно что угодно задать. Вот коды клавиш:

1  2  3  4  5  6  7  8
49 50 51 52 53 54 55 56
Q  W  E  R  T  Y  U  I
81 87 69 82 84 89 85 73
A  S  D  F  G  H  J  K
65 83 68 70 71 72 74 75
Z  X  C  V  B  N  M  ,
90 88 67 86 66 78 77 188

 Добавлено: не может вызвать PeekMessage - системная ошибка 127 "не найдена указанная процедура". RegisterHotKey возвращает 1 (true). Пытался глянуть вызвать RtlGetLastWin32Error() с NativeAPI после PeekMessage, так выполнение до неё даже не доходит. А указать

PM=PeekMessage(lpMsg[],...

 - выходит ошибка компиляции.