[ARŞİV] Forumu kirletmemek için herhangi bir acemi sorusu. Profesyonel, kaçırmayın. Sensiz hiçbir yerde - 5. - sayfa 259

 
paladin80 :
Zarar durdurunca kapatılmalıdır. Forex ticareti 00:00 GMT'de açılır.

Ancak StopLoss fiyatından değil, StopLoss'tan çok daha düşük olabilen ilk fiyattan kapanacaktır! Ve TakeProfit kesinlikle kapalı. Bu nedenle, zararı durdur ile ayrılmamak daha iyidir ve hafta sonu için pozisyon bırakmamak daha da iyidir!
 

Özel işlevinizin adresini nasıl öğrenebilirsiniz? Yani, eğer bir listem varsa

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

peki myFunc adresini nasıl öğrenebilirim? Daha sonra class parametresine iletilecek WndProc adresinin (kullanıcı tanımlı bir fonksiyon ile tanımlıyorum) nasıl bulunacağını anlamak için gereklidir.

 
paladin80 :
Zarar durdurunca kapatılmalıdır. Forex ticareti 00:00 GMT'de açılır.

Gerçek olmaktan çok uzak, ilk alıntıyı kapatabilir. Belgeleri okumak gerekiyor ve DC'ler istedikleri gibi yazıyorlar.
 
gyfto :

Özel işlevinizin adresini nasıl öğrenebilirsiniz? Yani, eğer bir listem varsa

peki myFunc adresini nasıl öğrenebilirim? Daha sonra class parametresine iletilecek WndProc adresinin (kullanıcı tanımlı bir fonksiyon ile tanımlıyorum) nasıl bulunacağını anlamak için gereklidir.


Adresi olduğunu kim söyledi ki? bu bir MQL4 işlevidir: kelimenin tam anlamıyla derlenmez, ancak programın yürütülmesi sırasında yorumlayıcı aracılığıyla çalıştırılır.
 

Bir EA neden siparişleri değiştirmiyor?

İşte fonksiyon:

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

Başlangıçta şöyle sesleniyorum:

 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 :

Yardım için teşekkürler.
 
alsu :

Adresi olduğunu kim söyledi ki? bu bir MQL4 işlevidir: kelimenin tam anlamıyla derlenmez, ancak programın yürütülmesi sırasında yorumlayıcı aracılığıyla çalıştırılır.


Köpeğin gömülü olduğu yer orası. O zaman, robot için yalnızca MQL4 + WinAPI çerçevesinde kendi kendine yazılmış dll'ler olmadan bağımsız bir pencere arayüzü seçimi nedeniyle harcanan 2-3 hafta için üzgünüm. Bunu daha önce anlamamış olmam üzücü, kodum ve geliştirmelerim için üzgünüm.

Özetliyoruz. Kodu dll'nize taşımadan örtüşen (yani bir alt değil) pencere oluşturmak imkansızdır, çünkü WNDCLASS (veya WNDCLASSEX) açıklanırken

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;

yapıyı bir int dizisine paketlerken okla gösterilen satırlarda

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 ]);

pencere prosedürünün adresi iletilir, yani. bu pencere için fare ve klavye işleyicisi. MQL4'te bir pencere prosedürü, kullanıcı tanımlı bir işlev olarak uygulanabilir, ancak adresi yorumlayıcı içinde alınamaz, dolayısıyla aktarılacak hiçbir şey yoktur. MQL4'te mümkün olan maksimum standart pencere sınıflarını kullanmaktır, ancak bunlar yalnızca alt pencereler olarak kullanımlarını ima eder. Basit bir ifadeyle, gösterge tarafından oluşturulan böyle bir pencere fare ile tutulamaz ve terminalin dışına taşınamaz (çünkü bu bir alt pencere olacaktır), örtüşen bir pencere ise terminalin dışına taşınabilir. Standart pencere sınıflarındaki alt pencereler, herhangi birinin ihtiyacı varsa, mt4gui.dll'de zaten uygulanmaktadır. Ancak fare ve klavye işleyicisi ile örtüşmesi imkansızdır.

Moderatörlerin bu diyaloğu ve ilgili tüm mesajları "MQL4'te pencere nasıl oluşturulur" gibi ayrı bir konuya taşımaları rica olunur, böylece başkaları da aynı hatayı yapmaz ve bir arama motorunda bulabilir.

 
merhaba, indirilen metatreider4. demo versiyonunda olduğu gibi ticaret sekmesi açılmıyor (((. bana neyin yanlış olduğunu söyle ??????)
 

Tünaydın!

Belki birisi komisyoncunun tüccarın bilgisayarının ip adresini okuduğunu biliyordur.   sadece çevrimiçi modda mı yoksa MT4'teki bir klasörden geçmişi de yüklemek teknik olarak mümkün mü?

 

"Kısayol tuşlarını" uygulamaya karar verdim (Ctrl, Alt, Shift gibi kontrol tuşlarını kullanmadan). Ama kod çalışmıyor.

 #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 );
  }

Neden çalışmıyor olabilir? Teoride, gülen surat değişmelidir. 81'i (anahtar kodu Q) ayarladım, ancak orada herhangi bir şeyi ayarlayabilirsiniz. İşte anahtar kodlar:

 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

Eklendi : PeekMessage çağrılamıyor - sistem hatası 127 "Belirtilen prosedür bulunamadı". RegisterHotKey 1 (true) değerini döndürür. PeekMessage'dan sonra NativeAPI ile RtlGetLastWin32Error()'u aramaya çalıştım, bu yüzden yürütme ona bile ulaşmıyor. Ve belirtin

PM=PeekMessage(lpMsg[],...

- bir derleme hatası oluşur .

Neden: