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

 

kombat 17.07.2009 22:13

Some, compre 3 lotes e contraponha este volume venda 3 lotes

.......................

Como opção, sim. Embora, se já houver ordens de venda abertas, a EA pode fechar não as que você precisa. Deve ser resolvido.

kombat 17.07.2009 22:13.

Mas para responder à sua pergunta: é possível fechar todas as posições?

sim é, um por um, é um roteiro rápido, aap! e é isso aí...

.........................

É isso que estou usando agora. Um conjunto de scripts - você usa este, depois aquele... Mas eu tentei codificar minha estratégia em Expert Advisor e encontrei uma série de dificuldades.

 
gince >> :
Eu tenho algo que não funciona aqui, significa que não fecha nenhum erro.

Na função ClosePositions(), sua biblioteca b-Positions.mqh, KimIV usa uma chamada para sua outra função ClosePositionsBySelect() que proíbe o uso de ee no testador :

if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;


Para testes de história use sua biblioteca b-ForTest.mqh

 
BoraBo писал(а) >>

Na função ClosePositions(), sua biblioteca b-Positions.mqh, KimIV usa uma chamada para sua outra função ClosePositionsBySelect() que proíbe o uso de ee no testador :

if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;

Para testes de história, use sua biblioteca b-ForTest.mqh

Você entendeu mal meu código... Traduzindo para russo... Se NÃO for permitido o modo de teste AND (EA NÃO é permitido negociar OU o Expert Advisor é interrompido), então aborte o loop. Para simplificar, esta linha garante a saída do loop, quando você pressiona o botão "Expert Advisors" na barra de ferramentas.

 
Desculpe a confusão.
 

Boa noite,

Infelizmente, há também uma discrepância com a matriz... Quando a contagem dos pedidos é feita com uma condição se os lotes forem maiores que 0 (Lts>0), os lotes são fechados um a um (quando o lucro foi alcançado), mas o lucro total deve ser levado em conta:

   int Tip;                               // Тип ордера
   int Ticket=0,                          // Номер ордера
   Tkt;                                   // Количество номеров ордеров
   double Lot=0,                          // Количество закр. лотов
   Lts;                                   // Количество лотов всего
   double Price_Cls;                      // Цена закрытия ордера
   int Errors;
//--------------------------------------------------------------- 3 --

      for(int mm=1; mm<= Mas_Ord_Tek[0][0]; mm++)// Цикл по живым ордерам
        {
         if( Mas_Ord_Tek[ mm][6]== Tip &&     // Среди ордеров нашего типа
            Mas_Ord_Tek[ mm][5]> Lot &&      // .. выбираем лоты
            Mas_Ord_Tek[ mm][4]> Ticket)     // .. выбираем номер ордера
           {                              // Этот больше ранее найден.
            Lts= Mas_Ord_Tek[ mm][5]+ Lot;
            Tkt= Mas_Ord_Tek[ mm][4]+ Ticket;
           }
        }
      if ( Tip==0) Price_Cls=Bid;          // Для ордеров Buy
      if ( Tip==1) Price_Cls=Ask;          // Для ордеров Sell
      if ( BuyOrdProf>100 && Lts>0)
      Ans=OrderClose( Tkt, Lts, Price_Cls,0,Red);// Закрыть все ордера

E em condições de contagem de pedidos, se os lotes forem mais de 1 (Lts>1), os lotes não são fechados:

   int Tip;                               // Тип ордера
   int Ticket=0,                          // Номер ордера
   Tkt;                                   // Количество номеров ордеров
   double Lot=0,                          // Количество закр. лотов
   Lts;                                   // Количество лотов всего
   double Price_Cls;                      // Цена закрытия ордера
   int Errors;
//--------------------------------------------------------------- 3 --

      for(int mm=1; mm<= Mas_Ord_Tek[0][0]; mm++)// Цикл по живым ордерам
        {
         if( Mas_Ord_Tek[ mm][6]== Tip &&     // Среди ордеров нашего типа
            Mas_Ord_Tek[ mm][5]> Lot &&      // .. выбираем лоты
            Mas_Ord_Tek[ mm][4]> Ticket)     // .. выбираем номер ордера
           {                              // Этот больше ранее найден.
            Lts= Mas_Ord_Tek[ mm][5]+ Lot;
            Tkt= Mas_Ord_Tek[ mm][4]+ Ticket;
           }
        }
      if ( Tip==0) Price_Cls=Bid;          // Для ордеров Buy
      if ( Tip==1) Price_Cls=Ask;          // Для ордеров Sell
      if ( BuyOrdProf>100 && Lts>1)
      Ans=OrderClose( Tkt, Lts, Price_Cls,0,Red);// Закрыть все ордера

Favor informar quem pode ver o erro.

Ou talvez, Igor, eu tenha um mal-entendido em usar sua função?

BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); // Função de chamada

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает суммарный профит открытых позиций в валюте депозита |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
  double p=0;
  int    i, k=OrdersTotal();

  if ( sy=="0") sy=Symbol();
  for ( i=0; i< k; i++) {
    if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()== sy || sy=="") && ( op<0 || OrderType()== op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if ( mn<0 || OrderMagicNumber()== mn) {
            p+=OrderProfit()+OrderCommission()+OrderSwap();
          }
        }
      }
    }
  }
  return( p);
}
 

Igor, por favor me diga como inserir sua função PriceOpenLastPos no indicador.

Ao compilar o editor dá erro no primeiro colchete e nas variáveis subseqüentes.

double PriceOpenLastPos( string sy="", int op=-1, int mn=-1) {
datetime t;
double r=0;
int k=OrdersTotal();

if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy===") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderOpenTime()) {
t=OrderOpenTime();
r=OrderOpenPrice();
}
}
}
}
}
}
} }
return(r);
}
}

(' - definição de função inesperada D:\MT4\experts\indicators\Astrea.mq4 (627, 24)
'sy' - variável não definida D:\MT4\experts\Astrea.mq4 (632, 7)
etc.

Eu implemento a lógica de formação de sinais de negociação em um indicador e envio o sinal gerado para o Expert Advisor através de uma variável global para abrir/fechar ordens.

Eu preciso do preço aberto de uma ordem para tomar algumas decisões, por isso estou tentando fazer isso. Meu indicador é dinâmico e só pode ser depurado em modo de demonstração ou em modo de visualização em um testador.

 

A imagem é que não é o lucro total que é levado em conta, mas o lucro dos pedidos individuais.

 
Angela, o compilador não esperava encontrar a definição da minha função neste lugar em particular. Isso significa que em algum lugar mais acima no código você tem algo em falta. Talvez um ponto-e-vírgula ou uma cinta de fechamento enrolada. De qualquer forma, verifique o código cuidadosamente.
 
hope писал(а) >>
BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); // Chamada de função

Parâmetro incorreto passando para a função. Deveria ser assim:

BuyOrdProf=GetProfitOpenBuyPosInCurrency("", OP_BUY);
 
KimIV >> :

Parâmetro incorreto passando para a função. Deveria ser assim:

Acrescentar uma ligação ao símbolo na chamada de função não ajuda. Por que conta o lucro para cada posição separadamente (foto acima)?