Perguntas sobre a MQL4 - página 7

Forex Trader  
Em algum lugar do fórum os desenvolvedores escreveram em algum detalhe sobre como funciona o init/deinit. Talvez alguém possa fornecer um link?
Forex Trader  
Olá a todos, aqui vai uma pergunta:
Eu fiz uma DLL em Delphi, eu a chamo de MT4. Tudo funciona, exceto parâmetros simples passados por referência. Em Delphi, declarado como segue:

procedure Test2(var i: integer); stdcall;
begin
if addr(i) = nil then ShowMessage('What the hell?');
end;

stop to call it as

#import "DLL1.dll"
void Test2(int& i);

Chamo
int init() {
int x = 5;
Test2(x);
return(x);
}

quando chamado, uma referência ao inteiro da variável deve estar na pilha, mas nulo está lá
então como passar um parâmetro int por referência?
Ao passar uma string como referência, o valor da array é passado pela referência

usando
MetaEditor 4.00 build 183
MetaTrader 4.00 build 186

mais uma pergunta: se eu passar uma string como referência, qual é o tamanho do buffer de string?

mais uma pergunta:
Se eu passar uma string como resultado de uma função, onde a área de memória para a string deve ser alocada? Devo passar um ponteiro para uma variável global na DLL? Neste caso, posso ter certeza de que a DLL não será chamada de diferentes fios simultaneamente em nenhum modo de metatrader?

Obrigado de antemão
Forex Trader  
1) Se eu passar a corda como referência, qual é o tamanho do buffer de recepção da corda?

2) Se eu passar a corda como resultado de uma função, onde a área de memória da corda deve ser alocada? Devo passar um ponteiro para uma variável global na DLL? Neste caso, posso ter certeza de que a DLL não será chamada de diferentes fios simultaneamente em nenhum modo do metatrader?

Obrigado de antemão
Forex Trader  
Como implementar isto em MQL4 <br/ translate="no"> No início do dia defina dois pedidos pendentes
Quando um (qualquer) for acionado - o segundo é apagado
Cinco minutos antes do fechamento da barra (digamos um dia) para fechar o acionado (se não foi fechado por SL ou TP)
Se nenhum pedido pendente for acionado, cinco minutos antes de fechar a barra, apague ambos
Obrigado antecipadamente

Você estabelece ordens pendentes no momento certo (isso é fácil). E você começa a verificar os pedidos. Assim que uma ordem de Compra ou Venda aparece, você trabalha através da remoção da ordem pendente (ainda mais fácil). E então, na hora certa, trabalhar para fechar todas as encomendas (isto é fácil).
Forex Trader  
Как в MQL4 реализовать такое
в начале дня устанавливаем два отложенных ордера
После того как один(любой) сработал - второй удаляется
За пять минут до закрытия бара(допустим дневного) закрыть сработавший (если он не был закрыт по SL или TP)
Если ни один отложенный ордер не соработал то за пять минут до закрытия бара удаляем их обоих
Заранее спасибо

É assim que você o implementa, você coloca ordens pendentes no momento certo (é fácil). E então você começa a verificar as ordens. Assim que uma ordem de compra ou venda aparece, você trabalha através da remoção da ordem pendente (isto é ainda mais fácil). E então, na hora certa, trabalhar para fechar todas as encomendas (é muito fácil).


Eu pedi um código de trabalho (talvez alguém o tenha implementado).
Tudo o que eu fiz foi não trabalhar... O processo de odrerdelete é de alguma forma confuso.
Outra pergunta: às vezes o preço congela (sem ticks) por alguns minutos, ou seja, não podemos fechar um pedido, pois o corpo int start() não é executado, embora os ticks sejam recebidos para outros símbolos, é possível passar o valor Curetime a partir de qualquer símbolo com ticks?
Em termos simples, o valor Curetime praticamente não congela
Forex Trader  
O que você quer fazer é o ABC. Sem entender como funcionam os operadores básicos, não se pode chegar ao fundo do poço. E você pode fechar todos os pedidos a partir de qualquer tabela. Você pode fazer desta maneira:
 cnt=0; while(cnt<1) { if(OrderTotal()<1)break; OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); cmd=OrderType(); for(z=0;z<3;z++) { RefreshRates(); if(cmd===2||cmd===3|cmd===4|cmd===5)result=OrderDelete(OrderTicket())); 
     if(cmd==0) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),5,CLR_NONE); if(cmd===1) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),5,CLR_NONE); if(result) break;Sleep(1000); } Sleep(10000); } Sleep(10000)
Forex Trader  
O que você quer fazer é o ABC. Sem entender como funcionam os operadores básicos, não se pode chegar ao fundo do poço. E você pode fechar todos os pedidos a partir de qualquer tabela. Você pode fazer desta maneira:<br/ translate="no">
 cnt=0; while(cnt<1) { if(OrdersTotal()<1)break; OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); 
    cmd=OrderType(); for(z=0;z<3;z++) { RefreshRates(); if(cmd===2||cmd===3|cmd===4||cmd====5)result=OrderDelete(OrderTicket())); 
     if(cmd==0) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),5,CLR_NONE); if(cmd===1) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),5,CLR_NONE); if(result) break;Sleep(1000); } Sleep(10000); } Sleep(10000)



E o que faz este fragmento de código?
Elimina ambas as ordens pendentes que ainda não foram acionadas