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

 
alexpert007 >> :

E aqui está outra pergunta para Igor.

Você criou uma função personalizada separada (ou outra) para inverter a posição de compra-venda e vice-versa, sem a habitual OrderClose - OrderSend?

Não sou Igor, mas existe uma função OrderCloseBy padrão para inverter.

 

Olá, eu preciso de ajuda para resolver um problema. Deixe-me tentar descrevê-lo:

Há uma função que conta as ordens:

int OrdersAll(int mag)
{
int kolvo=0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if((OrderType()==OP_BUY || OrderType()==OP_SELLL) && OrderSymbol()==Symbol() && OrderMagicNumber() == mag )
kolvo++;
}
}
return(kolvo);
}

Além disso, no processo, se não houver pedido para o símbolo atual, quando a condição for atendida, 1 pedido, por exemplo, para comprar deve ser colocado:

if(OrdersAll(MAGICNO)==0)
{
if(condição)
{
op=Ask;if(SL>0){sl=Ask-SL*Point*mn;}if(TP>0){tp=Ask+TP*Point*mn;}
err=OrderSend(Symbol(),OP_BUY,LotsOptimized(),NormalizeDouble(op,Digits),3,NormalizeDouble(sl,Digits),
NormalizeDouble(tp,Digits),"",MAGICNO,0,Blue);
if(err<0)
{
Print("OrderSend()- Error OP_BUY. O pedido não é aceito. op "+op+" sl "+sl+" tp "+tp+""+GetLastError());return(-1);
}
}
}

Em vez disso, ao abrir vários símbolos no terminal e executar uma EA em cada um deles, por exemplo, o código acima pode abrir uma ordem - isto é correto, mas ao mesmo tempo pode abrir 20-30 ordens até que a morsa se esgote se a condição se mantiver por vários tiquetaques. Ainda não vi isso acontecer em um único instrumento, mas também não tenho certeza se isso não acontecerá em um único instrumento. Como eu conserto meu código para dificultar a abertura de não mais que um pedido.

 

Igor, boa noite,

Eu não posso administrar sua chamada de função:

//+----------------------------------------------------------------------------+
//| Autor : Kim Igor V. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Versão : 19.02.2008 |
//| Descrição : Retorna o lucro total das posições em aberto na moeda do depósito |
//+----------------------------------------------------------------------------+
//| 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) |
//+----------------------------------------------------------------------------+
duplo GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
duplo p=0;
int i, k=OrdensTotal();

se (sy=="0") sy=Símbolo();
para (i=0; i<k; 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) {
p+=OrderProfit()+OrderComission()+OrderSwap();
}
}
}
}
}
retorno(p);
}

Você pode me dizer, na chamada TotOrdProf=GetProfitOpenBuyPosInCurrency(EURUSD, ____, 1);

1. Suponha EURUSD, se estiver entre aspas "EURUSD" ou se for permitido sem ele;

2. Qual deve ser o segundo parâmetro de chamada (onde é um traço) para calcular o lucro total de compra e venda (eu tentei o padrão -1; não correto)

3. O terceiro parâmetro é o número mágico do Expert Advisor? - Ainda não cheguei a ele, apenas uma pergunta se entendi corretamente o parâmetro.

Obrigado.

 

TotOrdProf=GetProfitOpenBuyPosInCurrency("EURUSD",-1, -1);

- somente para EURUSD

- todas as posições em aberto (-1)

- posições com qualquer magik (-1)

 

Boa tarde.

Como você sabe, Sleep() não funciona no terminal de teste, então você tem que usar laços de funções matemáticas para atrasar a execução:

if (IsTesting()==true){for(int z0 = 1; z0 < zFILE*10000; z0++){MathSqrt(MathPow(5,5));MathSqrt(MathPow(5,5));MathSqrt(MathPow(5,5));}}

onde zFILE é o Expert Advisor's execution delay.

Minha pergunta é: Existe uma solução mais sofisticada, pois preciso de algum atraso de alguns segundos a 10-20min (processamento de dados por programa externo)?

Ou pelo menos como medir o tempo de execução com mais precisão (o desempenho dos processadores é diferente) e pegar o mais lento ?





 
Piboli >> :

Pergunta: existe uma solução mais elegante (função de atraso), pois o atraso é necessário de alguns segundos a 10-20min (processamento de dados por software externo) ?

Não tentou usar callbacks e sincronizadores?

 

As funções de Kim

Será que existe uma função que lhe permite puxar o nome do último padrão?

e registrar mudanças em seus componentes


 

KimIV talvez você possa e escreva um indicador

O indicador deve procurar um canal plano dentro de um período de tempo especificado e não mais amplo do que o especificado nas configurações

Este indicador deve pesquisar o canal dentro de um dia e com transição para o dia seguinte como em sua função éTradeTimeInt().
Este indicador pode desenhar 5 canais durante um dia ou apenas um.
Nas configurações

dupla altura máxima externa do canal em pontos
tempo int externo Bar_Time como calculamos o intervalo de tempo em barras (1) ou horas e minutos (2)
intervalo de tempo mínimo de fio externo do canal em horas e minutos
Intervalo de tempo mínimo int int externo do canal em barras
número máximo de canais sorteados externos que permanecem sorteados

Anexei um indicador semelhante a https://www.mql5.com/ru/code, mas ele desenha o canal em um intervalo de tempo estritamente definido e não procura tal canal por si só. Deve procurar apenas um canal que não exceda a altura máxima do canal e que não seja inferior ao intervalo de tempo mínimo do canal.
Se escolhermos Bar_Time para o tempo do canal, o canal(1) é calculado a partir do tempo atual menos o tempo dado nas configurações, ou seja, 2 horas 15 min ou outro tempo. Se agora for 1 hora 15 min, procura-se o máximo e o mínimo a partir de 23 horas 00 minutos e se o máximo menos o mínimo estiver abaixo da altura máxima do canal, traça duas linhas max e min das 23:00 às 02:15. Ele também desenha os níveis de Fibo acima e abaixo do canal.

Se escolhermos Bar_Time por número de barras, o canal é calculado a partir da barra atual menos o número de barras especificado nas configurações, ou seja, da barra zero até a barra zero menos o número especificado nas configurações. Se o número escolhido for 50, buscamos o alto e o baixo das últimas 50 barras a partir da barra zero e se o alto menos o baixo não for maior que a altura máxima do canal, duas linhas de alto e baixo de 50 barras serão traçadas.

Todos os níveis e dados de canal são armazenados em buffers

 

Pergunta a Igor

Se você puder me dar um fragmento de código de um Expert Advisor trabalhando em duas contas separadas (Buy Sell), pesquisando o estado de cada conta (para calcular o tamanho do lote) e tendo a capacidade de transferir o depósito de uma conta para outra, bem como simulando o saque de parte do depósito sob certas condições (digamos um lucro mensal ou trimestral - a partir dele n%)

Deixe-me esclarecer minha pergunta

1 Expert Advisor trabalha em Buy (sondagens estado da conta 2) . 6200

2 Expert Advisor abre posição de Venda (solicita saldo de conta em 1) ... 8400

Se não houver posições em aberto

1100 da conta 2 para a conta 1

conta 1 - 7300

conta 2 - 7300

depósito bruto total SD=14600 Risco máximo - 10% Lote máximo 0,14

Mais

a partir de 01.04.09 SD=10000

a partir de 01.07.09 SD=14600

Lucro=4600

10% = 460

460 deduzidos na terceira conta

Obrigado

 

Caro Igor, me ajude!

Eu conectei a-SimpleTrailing.mqh.

Acrescentei o que foi especificado, mas 3 erros estão aparecendo:

'clModifyBuy' - variável não definida
'clModifySell' - variável não definida
'ti' - variável já definida

O que fazer?(



Aqui está o que se encaixa:

.........................
   total=OrdersTotal();
   if( total<1)
     {
      if(AccountFreeMargin()<(1000* Lots))
        {
         Print("У вас нет денег. Свободные средства = ", AccountFreeMargin());
         return(0);
        }
      if(Hour()>=0)
        {
         chk=1;
         Print("Позиция возможна!");
        }
      if( chk==1)
        {
         if((Low[0]<= MaDert1sell) || (Low[0]<= MaDert2sell))
           {
int ti= OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect( ti, SELECT_BY_TICKET))
ModifyOrder(-1, Ask-30*Point, Bid-99*Point, clModifySell);
            if( ticket>0)
              {
               if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
                  Print("Открыт ордер SELL : ",OrderOpenPrice());
               chk=0;
              }
            else
              {
               Print("Ошибка открытия SELL ордера : ",GetLastError());
               return(0);
              }
           }
         if((High[0]>= MaDert1buy) || (High[0]>= MaDert2buy))
           {
int ti= OpenPosition(NULL, OP_BUY, 0.1);
if (OrderSelect( ti, SELECT_BY_TICKET))
ModifyOrder(-1, Ask-30*Point, Bid-99*Point, clModifyBuy);
            if( ticket>0)
              {
               if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
                  Print("Открыт ордер BUY : ",OrderOpenPrice());
               chk=0;
              }
            else
              {
               Print("Ошибка открытия BUY ордера : ",GetLastError());
               return(0);
              }
           }
        }
      return(0);
     }
   for( cnt=0; cnt< total; cnt++)
     {
      OrderSelect( cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // это открытая позиция? OP_BUY или OP_SELL 
         OrderSymbol()==Symbol())  // инструмент совпадает?
        {
         if(OrderType()==OP_BUY)   // открыта длинная позиция
           {
            // проверим, может уже пора закрываться?
            if(Hour()==23)
              {
               chk=0;
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // закрываем позицию
               return(0); // выходим
              }
           }
         else // иначе это короткая позиция
           {
            // проверим, может уже пора закрываться?
            if(Hour()==23)
              {
               chk=0;
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // закрываем позицию
               return(0); // выходим
              }

           }
        }
     }
   return(0);
  }

//+----------------------------------------------------------------------------+
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 28.11.2006                                                     |
//|  Описание : Модификация одного предварительно выбранного ордера.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена установки ордера                                              |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    cl - цвет значка модификации                                            |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, color cl=CLR_NONE) {
  bool   fm;
  double op, pa, pb, os, ot;
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er, it;
 
  if ( pp<=0) pp=OrderOpenPrice();
  if ( sl<0 ) sl=OrderStopLoss();
  if ( tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble( pp, dg);
  sl=NormalizeDouble( sl, dg);
  tp=NormalizeDouble( tp, dg);
  op=NormalizeDouble(OrderOpenPrice() , dg);
  os=NormalizeDouble(OrderStopLoss()  , dg);
  ot=NormalizeDouble(OrderTakeProfit(), dg);
 
  if ( pp!= op || sl!= os || tp!= ot) {
    for ( it=1; it<= NumberOfTry; it++) {
      if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
      while (!IsTradeAllowed()) Sleep(5000);
      RefreshRates();
      fm=OrderModify(OrderTicket(), pp, sl, tp, 0, cl);
      if ( fm) {
        if ( UseSound) PlaySound( NameFileSound); break;
      } else {
        er=GetLastError();
        pa=MarketInfo(OrderSymbol(), MODE_ASK);
        pb=MarketInfo(OrderSymbol(), MODE_BID);
        Print("Error(", er,") modifying order: ", ErrorDescription( er),", try ", it);
        Print("Ask=", pa,"  Bid=", pb,"  sy=",OrderSymbol(),
              "  op="+ GetNameOP(OrderType()),"  pp=", pp,"  sl=", sl,"  tp=", tp);
        Sleep(1000*10);
      }
    }
  }
}
//+----------------------------------------------------------------------------+
//|  Возвращает наименование торговой операции                                 |
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
	switch ( op) {
		case OP_BUY      : return("Buy");
		case OP_SELL     : return("Sell");
		case OP_BUYLIMIT : return("Buy Limit");
		case OP_SELLLIMIT: return("Sell Limit");
		case OP_BUYSTOP  : return("Buy Stop");
		case OP_SELLSTOP : return("Sell Stop");
		default          : return("Unknown Operation");
	}
}
//+----------------------------------------------------------------------------+