Perguntas sobre a MQL4 - página 7

 
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?
 
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
 
a implementação atual é tal que você só pode passar parâmetros por referência dentro de um único código fonte. a exceção são arrays. se você passar um array para a dll, você pode alterar os valores de seus elementos e estas alterações estarão disponíveis na função de chamada. ou seja, você pode passar um array muito pequeno.
 
Como implementar isto na MQL4
no início do dia defina duas ordens pendentes
Uma vez acionada uma (qualquer) - a segunda é removida
Cinco minutos antes do fechamento da barra (digamos, diariamente) para fechar a barra acionada (se não foi fechada por SL ou TP)
Se nenhuma ordem pendente for acionada, cinco minutos antes de fechar a barra exclua ambas
Muito obrigado
 
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
 
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).
 
Как в 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
 
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)
 
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
 
Você pediu a ele que destruísse todas as ordens cinco minutos antes do fechamento do bar, então ele as derrubará todas. Basta definir o tempo corretamente. E usar outras peças de código para fechar pedidos desnecessários. Ou, você quer que o programa inteiro seja escrito para você?
Razão: