[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 259

 
paladin80:
Deve fechar em uma parada de perda. O Forex abre às 00:00 GMT.

Mas fechará não ao preço stopLoss, mas ao primeiro preço, que pode ser muito mais baixo do que o stopLoss! E a TakeProfit fechará com certeza. Portanto, é melhor não sair com o StopLoss, e ainda melhor não deixar posições para o fim de semana!
 

Como posso descobrir o endereço da minha função de usuário? Isto é, se minha lista diz

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

então como posso obter o endereço do meuFunc? Preciso dele para saber como encontrar o endereço do WndProc (descrevo com função personalizada) para passar mais adiante ao parâmetro de classe.

 
paladin80:
Deve fechar em uma parada de perda. O Forex abre às 00:00 GMT.

Está longe de ser certo, pode muito bem fechar na primeira citação. Você tem que ler os documentos, e as corretoras escrevem o que quiserem.
 
gyfto:

Como posso descobrir o endereço da minha função de usuário? Isto é, se minha lista diz

então como posso obter o endereço do meuFunc? Preciso dele para saber como encontrar o endereço do WndProc (descrevo com função personalizada) para passar mais adiante ao parâmetro de classe.


Quem diz que ele tem sequer um endereço? é uma função MQL4: ele não é compilado nem no sentido literal da palavra, mas passa pelo intérprete em tempo de execução.
 

Por que o especialista não modifica as ordens?

Aqui está a função:

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

Chamado no início desta forma:

 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:

Obrigado por sua ajuda.
 
alsu:

Quem disse que ele tem sequer um endereço? É uma função MQL4: não é nem mesmo compilado no sentido literal da palavra, mas passa pelo intérprete em tempo de execução.


É lá que o cão é enterrado. Só lamento por 2 ou 3 semanas de perda de tempo, porque escolhi uma interface de janelas independente para meu robô dentro da MQL4+WinAPI sem nenhuma dll autoescrita. Desculpe não ter percebido antes, desculpe por meu código e desenvolvimentos.

Para resumir. Você não pode criar uma janela sobreposta (ou seja, não uma criança) sem copiar o código em sua dll, porque ao descrever WNDCLASS (ou 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;

linhas indicadas pela seta ao embalar a estrutura em uma matriz 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]);

o endereço do procedimento de janela, ou seja, o manipulador de mouse e teclado para esta janela, é passado. Um procedimento de janela na MQL4 pode ser implementado como uma função definida pelo usuário, mas é impossível obter seu endereço dentro do intérprete, de modo que não há nada a passar. O máximo que é possível na MQL4 é usar as classes de janelas padrão, mas elas serão usadas somente como janelas para crianças. Para simplificar, uma janela criada pelo indicador não pode ser agarrada com um mouse e colocada sobre a borda do terminal (já que será uma janela infantil), enquanto uma janela sobreposta pode ser colocada sobre a borda do terminal. A janela infantil nas classes de janela padrão já está implementada na mt4gui.dll, se alguém precisar. Mas a janela sobreposta com seu próprio mouse e manipulador de teclado é impossível.

Peço aos moderadores que coloquem este diálogo e todas as mensagens relacionadas a um tópico separado como "como criar uma janela na MQL4", para que outros não cometam os mesmos erros e possam encontrá-la em um mecanismo de busca.

 
Olá, eu baixei o metatreider4. a guia de negociação não está aparecendo como na versão demo(((. me diga o que está errado??????
 

Bom dia!

O corretor lê o endereço ip do computador do comerciante somente no modo on-line ou é tecnicamente possível carregar o histórico de alguma pasta no MT4?

 

Decidi implementar "hotkeys" (sem usar as teclas de controle como Ctrl, Alt, Shift). Mas o código não funciona.

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

Por que não funcionaria? Em teoria, o sorriso é suposto mudar. Eu defini 81 (código chave Q), mas você pode definir qualquer coisa lá. Aqui estão os códigos-chave:

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

Acrescentado: não se pode chamar PeekMessage - erro de sistema 127 "procedimento especificado não encontrado". RegisterHotKey retorna 1 (verdadeiro). Tentei procurar o RtlGetLastWin32Error() com NativeAPI depois do PeekMessage, ele nem chega a ele. E para apontar

PM=PeekMessage(lpMsg[],...

- o erro de compilação aparecerá.