[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 259

 
paladin80:
ストップロスで決済する必要があります。外為取引は日本時間の午前0時に開始されます。

しかし、ストップロスの価格ではなく、ストップロスよりはるかに低い最初の価格で決済されます。そしてTakeProfitは確実にクローズします。したがって、StopLossで放置しないほうがよく、さらに週末にポジションを放置しないほうがよいでしょう。
 

ユーザー機能のアドレスはどうすればわかりますか?つまり、もし私のリストに

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

では、myFuncのアドレスはどのように取得すればよいのでしょうか?WndProcのアドレス(カスタム関数で記述)を調べて、さらにクラスのパラメータに渡す方法を調べて欲しいです。

 
paladin80:
ストップロスで決済する必要があります。外為取引は日本時間の午前0時に開始されます。

確実とは言い難く、最初の見積もりで終了する可能性もあります。書類を読まなければならないが、証券会社は好き勝手なことを書いている。
 
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:

よろしくお願いします。
 
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[],...

- を選択すると、コンパイルエラーが 表示されます。