Características úteis da KimIV - página 49

 
KimIV писал (а) >>

Exemplos de como usar a função ExistOrders().

5. Verifique se há algum pedido com um tempo de ajuste de 2 horas ou mais

ExistOrders("", -1, -1, TimeCurrent()-2*60*60);

Boa noite, estou um pouco confuso com este comentário. Eu estou aqui sentado para descobrir! Não consigo descobrir como formular minha condição corretamente - "não antes de 5 min" ou "não depois de 5 min" ! (Foi claro para mim antes de começar a pensar sobre isso!)

Preciso apagar uma ordem pendente se ela não tiver sido acionada dentro de um determinado tempo. Por exemplo, dentro de 5 minutos após o ajuste!

Eu já o fiz:

if (ExistOrders(NULL, OP_BUYSTOP, Magic,TimeCurrent()-5*60) >0) //ЕСЛИ ЕСТЬ ОРДЕР BUYSTOP > 5 min 
                 DeleteOrders(NULL, OP_BUYSTOP, Magic);
if (ExistOrders(NULL, OP_SELLSTOP, Magic,TimeCurrent()-5*60) >0) //ЕСЛИ ЕСТЬ ОРДЕР SELLSTOP > 5 min  
                 DeleteOrders(NULL, OP_SELLSTOP, Magic);

Isto é correto? Mas não funciona no testador. As encomendas são feitas e imediatamente apagadas.

Por favor, informe como escrever corretamente ExistOrders() funciona ?

 
rid писал (а) >>
Estou um pouco confuso...

Parece que também estou confuso. Vamos nos organizar... :-)

O parâmetro ot (tempo de colocação de pedidos) foi introduzido na função ExistOrders para tratar corretamente os erros 128, 142 e 143. O objetivo do tratamento de erros é excluir configurações duplas (em casos práticos, até mesmo triplas) da mesma ordem. Para isso, o momento do envio do pedido é memorizado e as tentativas de negociação são pausadas. Após a pausa, a presença do pedido com o tempo definido após a memorização é verificada. Se houver uma ordem, conclui-se que o objetivo foi alcançado (a ordem foi estabelecida) e as tentativas de negociação são encerradas. Em outras palavras, o tempo após o qual a configuração do pedido é verificada é passado para o parâmetro ot. Mais tarde = não mais cedo.

rid escreveu (a) >>
Preciso apagar uma ordem pendente se ela não tiver sido acionada dentro de um determinado tempo. Por exemplo, dentro de 5 minutos após o ajuste!

O parâmetro ot da função ExistOrders não é útil aqui. Ela funciona na direção oposta. Ela trabalha no sentido de se aproximar do presente. O que você precisa fazer é trabalhar de trás para frente. O parâmetro de expiração da função OrderSend (ou o parâmetro ex da função SetOrder) é ótimo para isso.

 

A função ClosePosBySelect() para o testador.

Executa o fechamento de uma posição pré-selecionada. Esta é uma versão leve da função com o mesmo nome, previamente publicada na página 13. Nada a mais. Sem características extras. Em minha prática, nunca tive uma posição que não estivesse fechada no testador. É por isso que não há verificações nesta função. Eles são desnecessários no testador.

//+----------------------------------------------------------------------------+
//|  Автор   : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                    |
//+----------------------------------------------------------------------------+
//|  Версия  : 13.06.2007                                                      |
//|  Описание: Закрытие одной предварительно выбранной позиции                 |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
  double pp;

  if (OrderType()==OP_BUY) {
    pp=MarketInfo(OrderSymbol(), MODE_BID);
    OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseBuy);
  }
  if (OrderType()==OP_SELL) {
    pp=MarketInfo(OrderSymbol(), MODE_ASK);
    OrderClose(OrderTicket(), OrderLots(), pp, Slippage, clCloseSell);
  }
}

SZY. Exemplo de uso da função ClosePosBySelect() Darei mais tarde, juntamente com a função OpenPosition() para o testador.

 

Olá a todos. Para evitar ter que escavar páginas a cada vez, eu tinha que fazer o conteúdo ramo por ramo.

Eu consolidei as funções de temas semelhantes aqui e ali. Conteúdo de 1 a 40 páginas.

Aqueles que desejarem podem continuar e acrescentar outras páginas e colocá-las aqui.

Arquivos anexados:
 

Olá Igor, preciso de sua ajuda. Decidi implementar a função de fechamento no e-CloseByProfit EA semelhante ao e-CloseByPercentProfit.

Tudo funciona bem, o assessor especializado funciona corretamente e o terminal fecha. Mas quando eu reabro o terminal, ele o fecha imediatamente.

Por favor, ajude-me a mudar o código para corrigir este problema.

//+----------------------------------------------------------------------------+
//| e-CloseByProfit.mq4 |
//| Kim Igor V. aka KimIV |
//| http://www.kimiv.ru |
//| |
//| 22.10.2006 O Expert Advisor fecha todas as posições assim que o especificado |
//| nível de lucro.
//| 20.06.2008 Erro fixo no cálculo do lucro em pontos. |
//+----------------------------------------------------------------------------+
#direitos de propriedade intelectual "Kim Igor V. aka KimIV"
#link da propriedade "http://www.kimiv.ru"
#define MAGIC 20061022

//------- Parâmetros externos do Consultor Especialista ------------------------------------------
string externa _P_Expert = "---------- Parâmetros EA";
bool CurSymbolOnly = falso; // Somente o símbolo atual
intProfit externo = 100; // TakeProfit
fechamento de bool externoTerminal = Falso; // Fechar terminal
comentário externo ShowComment = True; // Comentário do show
conta externa int NúmeroConta = 0; // Número de conta de negociação
Use o som externo da bool Use o som = Verdadeiro; // Use o sinal sonoro
cordão externo NameFileSound = "manycoin.wav"; // Nome do arquivo de som
Escorregamento interno externo = 3; // Escorregamento de preço
Número interno externoOfTry = 5; // Número de tentativas

//------- Variáveis globais do Expert Advisor --------------------------------------
cor clCloseBuy = Azul; // cor clCloseSell = Vermelho; // cor do símbolo de fechamento da compra
cor ClCloseSell = Vermelho; // cor da bandeira de fechamento da venda
int CurProfit;

//------- Conexão de módulos externos -------------------------------------------
#incluir <stdlib.mqh>.
#Incluir <WinUser32.mqh>

//+----------------------------------------------------------------------------+
//| função de iniciação de especialista |
//+----------------------------------------------------------------------------+
init() { se (!IsTesting())) Comentário(""); }

//+----------------------------------------------------------------------------+
//| função de desinicialização especializada |
//+----------------------------------------------------------------------------+
void deinit() { if (!IsTesting()) Comentário("); }

//+----------------------------------------------------------------------------+
//| função de início especializado |
//+----------------------------------------------------------------------------+
início nulo() {
se (!IsTesting()) {
se (NumberAccount>0 && NumberAccount!=AccountNumber()) {
Mensagem("A negociação na conta é PROIBIDA" +ContaNúmero());
retornar;
} else Comment(");
}

CloseByProfit();
se (ShowComment) {
Comentário(IIFs(CurSymbolOnly, "CurSymbolOnly","),
"Lucro atual=",CurProfit", p.".
"Close Profit=",TakeProfit," p.".
);
}
}


//+----------------------------------------------------------------------------+
//| Autor : Kim Igor V. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Versão : 19.02.2008 |
//| Descrição : Fechamento de uma posição pré-selecionada |
//+----------------------------------------------------------------------------+
void ClosePosBySelect() {
bool fc;
fecharFechar;
duplo ll, pa, pb, pp;
int err, it;

if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
para (it=1; it<=NumberOfTry; it++) {
se (!IsTesting() && (!IsExpertEnabled() ||| IsStopped())) quebrar;
enquanto (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
se (OrderType()==OP_BUY) {
pp=pb; clClClose=closeBuy;
{} else {
pp=pa; clClClose=closeSell;
}
ll=OrderLots();
fc=OrderClose(OrderTicket(), ll, pp, Slippage, clClose);
se (fc) {
se (UseSound) PlaySound(NameFileSound); break;
{} else {
err=GetLastError();
se (err==146) enquanto (IsTradeContextBusy()) Dormir(1000*11);
Imprimir("Erro(",err,") Fechar ",GetNameOP(OrderType())," ",
ErrorDescription(err),", tente ",it);
Print(OrderTicket()," Ask=",pa," Bid=",pb," pp=",pp);
Imprimir("sy=",OrderSymbol()," ll=",ll," sl=",OrderStopLoss(),
tp=",OrderTakeProfit()"," mn=",OrderMagicNumber());
Dormir(1000*5);
}
}
} else Print("Invalid trade operation. Fechar ",GetNameOP(OrderType()));
}

//+----------------------------------------------------------------------------+
//| Autor : Kim Igor V. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Versão : 19.02.2008 |
//| Descrição : Fechamento de posições a preço de mercado primeiro rentável |
//+----------------------------------------------------------------------------+
//| Parâmetros: |
//| sy - nome do instrumento (" - qualquer símbolo, |
//| NULL - símbolo atual) |
| //| op - operação (-1 - qualquer posição) |
//| mn - MagicNumber (-1 - qualquer magik) |
//+----------------------------------------------------------------------------+
void ClosePosFirstProfit(string sy="", int op=-1, int mn=-1) {
int i, k=OrdensTotal();
se (sy=="0") sy=Símbolo();

// Primeiras posições lucrativas próximas
para (i=k-1; i>=0; i--) {
se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
se ((OrderSymbol()==sy ||| sy==") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
se (mn<0 || OrderMagicNumber()==mn) {
se (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
}
}
}
}
}
// então todo o resto
k=OrdensTotal();
para (i=k-1; i>=0; i--) {
se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
se ((OrderSymbol()==sy ||| sy==") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
se (mn<0 || OrderMagicNumber()==mn) ClosePosBySelect();
}
}
}
}
}

//+----------------------------------------------------------------------------+
//| Fechando todas as posições sobre o lucro |
//+----------------------------------------------------------------------------+
void CloseByProfit() {
pa duplo, pb, pp;
int i, k=OrdensTotal(), pr=0;

para (i=0; i<k; i++) {
se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
se (!CurSymbolOnly || OrderSymbol()==Symbol()) {
pa=MarketInfo(OrderSymbol(), MODE_ASK);
pb=MarketInfo(OrderSymbol(), MODE_BID);
pp=MarketInfo(OrderSymbol(), MODE_POINT);
if (pp==0) if (StringFind(OrderSymbol(), "JPY")<0) pp=0,0001; ou pp=0,01;
se (OrderType()==OP_BUY) {
pr+=NormalizeDouble((pb-OrderOpenPrice())/pp, 0);
}
se (OrderType()==OP_SELL) {
pr+=NormalizeDouble((OrderOpenPrice()-pa)/pp, 0);
}
}
}
}
CurProfit=pr;
if (CurProfit>=TakeProfit) ClosePosFirstProfit();
se (CloseTerminal && !ExistPositions()) CloseTerminal();
}
//+----------------------------------------------------------------------------+
//| Feche o terminal comercial. |
//+----------------------------------------------------------------------------+
void CloseTerminal() {
Imprimir("CloseTerminal() desencadeou;)
int hwnd=WindowHandle(Symbol(), Period());
int hwnd_parent=0;

while(!IsStopped()) {
hwnd=GetParent(hwnd);
se (hwnd==0) quebra;
hwnd_parent=hwnd;
}
se (hwnd_parent!=0) PostMessageA(hwnd_parent, WM_CLOSE, 0, 0);
}

//+----------------------------------------------------------------------------+
//| Devolve a bandeira de existência |
//| Parâmetros: |
//| sy - nome do instrumento (" - qualquer símbolo, |
//| NULL - símbolo atual) |
| //| op - operação (-1 - qualquer posição) |
//| mn - MagicNumber (-1 - qualquer magik) |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sy="", int op=-1, int mn=-1) {
int i, k=OrdensTotal();

if (StringLen(sy)==1 && StringGetChar(sy, 0)==48) sy=Símbolo();
para (i=0; i<k; i++) {
se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy ||| sy==") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
se (op<0 || OrderType()==op) {
se (mn<0 || OrderMagicNumber()==mn) return(True);
}
}
}
}
}
retorno(Falso);
}
//+----------------------------------------------------------------------------+
//| Autor : Kim Igor V. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Versão : 01.09.2005 |
//| Descrição : Retorna o nome da operação comercial |
//+----------------------------------------------------------------------------+
//| Parâmetros: |||
//| op - identificador da operação comercial |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
interruptor (op) {
caso OP_BUY : retornar("Comprar");
caso OP_SELL : devolução("Vender");
caso OP_BUYLIMIT : devolução("BuyLimit");
caso OP_SELLLIMIT : devolução("SellLimit");
caso OP_BUYSTOP : devolução("BuyStop");
caso OP_SELLSTOP : devolução("SellStop");
default : devolução ("Operação Desconhecida");
}
}

//+----------------------------------------------------------------------------+
//| Autor : Kim Igor V. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Versão : 01.02.2008 |
//| Descrição : Retorna um de dois valores, dependendo da condição. |
//+----------------------------------------------------------------------------+
IIFs de corda(bool condition, string ifTrue, string ifFalse) {
se (condição) retornar(ifTrue); caso contrário, retornar(ifFalse);
}

//+----------------------------------------------------------------------------+
//| Mensagem de saída para comentar e log
//+----------------------------------------------------------------------------+
Mensagem nula(string m) {
Comentário(m);
se (StringLen(m)>0) Imprimir(m);
}
//+----------------------------------------------------------------------------+

 
Vkorch писал (а) >>
Olá Igor, preciso de sua ajuda. Decidi escrever a função de fechamento do terminal no e-CloseByProfit EA semelhante ao e-CloseByPercentProfit.

Tudo funciona bem, a EA funciona, o terminal fecha. Mas quando eu reabro o terminal, o Conselheiro Especialista o fecha imediatamente.
Ajudar a mudar um código de forma a eliminar essa falta.

Faça-o assim:

CurProfit=pr;
if (CurProfit>=TakeProfit) {
  ClosePosFirstProfit();
  if (CloseTerminal && !ExistPositions()) CloseTerminal();
}
 
KimIV писал(а) >>

Faça-o assim:

Obrigado, Igor. Fixou-o. Mas ao compilar, eu tenho um erro

(' - definição da função inesperada C:\Program Files\MetaTrader - Alpari Experts\e-CloseByProfit.mq4 (180, 19)

O que eu devo fazer?

 

Igor, você poderia fazer uma biblioteca de funções para trabalhar com pedidos e cargos? A biblioteca foi desenvolvida e testada por mais de 2 anos, eu anexei os arquivos, talvez algumas idéias venham a ser úteis.

Quanto a

OpenPosition("GBPJPY", OP_SELL, 0.1, pb+23*po, pb-44*po);

Talvez fosse melhor chamar OpenPosition("GBPJPY", OP_SELL, 0.1, 23, 44);

а

double pa=MarketInfo("USDCAD", MODE_ASK);
double pb=MarketInfo("USDCAD", MODE_BID);
double po=MarketInfo(
"USDCAD", MODE_POINT);
and this insert 
  
 
double lot_min =MarketInfo(Symbol(),MODE_MINLOT)
; 
if(Lots<lot_min) return;

calcular dentro da função, ou seja, passar o valor sl para e tp, e calcular e normalizar tudo corretamente dentro da função.


	          
Arquivos anexados:
 

Olá Igor!

Se eu tiver uma posição de 0,3 lote aberto, preciso fazê-lo:

1.Fechar parte de uma posição de 0,1 lote.

Modificar (mudar para outro nível de perda)

2.1 Parte mais próxima da posição 0,1 lote.

Modificar (estabelecer parada de perda para outro nível).

3.Posição próxima.

Mais uma pergunta? Quando a posição parcial é fechada.

OrderClose(OrderTicket(),NormalizeDouble(OrderLots()/3,2),Ask,3,Violet);

Eu recebo erro 131 (volume errado). como posso corrigi-lo ?

Responda por favor para um iniciante. pode ser em palavras.

.

 
Prival писал (а) >>
Igor, você poderia por favor fazer as funções trabalhar com pedidos e posições em uma biblioteca?

Não, não é... Em princípio, já está arranjado como deve ser... Não estou postando porque nem todas as funções desta biblioteca foram publicadas ainda... ainda há um casal ou três que apareceram desde que este fio foi iniciado.

E vou pensar sobre o resto...