[ARCHIVE] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 5. - 페이지 259

 
paladin80 :
손절 시 닫혀야 합니다. Forex 거래는 00:00 GMT에 시작됩니다.

그러나 그것은 StopLoss 가격이 아니라 StopLoss보다 훨씬 낮을 수 있는 첫 번째 가격으로 닫힐 것입니다! 그리고 TakeProfit은 확실히 폐쇄되었습니다. 따라서 손절매를 안고 떠나지 않는 것이 좋으며, 주말에는 포지션을 떠나지 않는 것이 좋습니다!
 

사용자 정의 함수의 주소를 어떻게 알 수 있습니까? 즉, 목록이 있는 경우

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

그러면 myFunc의 주소를 찾는 방법은 무엇입니까? 클래스 매개변수에 추가로 전달할 WndProc 주소(사용자 정의 함수로 설명)를 찾는 방법을 이해하려면 필요합니다.

 
paladin80 :
손절 시 닫혀야 합니다. 외환 거래는 00:00 GMT에 시작됩니다.

사실과는 거리가 먼 첫 번째 인용문에서 마무리될 수 있습니다. 문서를 읽어야 하며 DC는 원하는 대로 문서에 작성합니다.
 
gyfto :

사용자 정의 함수의 주소를 어떻게 알 수 있습니까? 즉, 목록이 있는 경우

그러면 myFunc의 주소를 찾는 방법은 무엇입니까? 클래스 매개변수에 추가로 전달할 WndProc 주소(사용자 정의 함수로 설명)를 찾는 방법을 이해하려면 필요합니다.


누가 그녀에게 주소가 있다고 했습니까? 이것은 MQL4 함수입니다. 문자 그대로의 의미로 컴파일되지도 않지만 프로그램 실행 중에 인터프리터를 통해 실행됩니다.
 

EA가 주문을 수정하지 않는 이유는 무엇입니까?

기능은 다음과 같습니다.

 //+-------------------------------------------------------------------------------------+
//| Первоначальная установка 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 :

도와 주셔서 감사합니다.
 
alsu :

누가 그녀에게 주소가 있다고 말했습니까? 이것은 MQL4 함수입니다. 말 그대로 컴파일되지는 않았지만 프로그램 실행 중에 인터프리터를 통해 실행됩니다.


개가 묻힌 곳입니다. 그렇다면 자체 작성 dll이 없는 MQL4 + WinAPI 프레임워크 내에서 로봇을 위한 독립 창 인터페이스를 선택했기 때문에 2-3주를 보낸 것에 대해 유감입니다. 이것을 더 일찍 이해하지 못한 것이 유감입니다. 제 코드와 개발에 대해 유감스럽게 생각합니다.

우리는 요약합니다. WNDCLASS(또는 WNDCLASSEX)를 설명할 때 코드를 dll로 이동하지 않고 겹치는(즉, 자식이 아닌) 창을 만드는 것은 불가능합니다.

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;

구조체를 int 배열로 패킹할 때 화살표로 표시된 라인에서

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 주소를 읽는다는 것을 알고 있을지도 모릅니다.   온라인 모드에서만 또는 기술적으로 MT4의 일부 폴더에서 기록을 업로드할 수도 있습니까?

 

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)을 반환합니다. PeekMessage 이후에 NativeAPI로 RtlGetLastWin32Error()를 호출하려고 해서 실행조차 되지 않습니다. 그리고 나타내다

PM=PeekMessage(lpMsg[],...

- 컴파일 오류가 발생합니다 .