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

 

Igor, você pode me dar uma dica? Algo do indicador(iMA) na EA os valores vêm com 4 casas decimais, enquanto eu preciso de 5 para trabalhar! Eu tentei NormalizeDuplo(iMA,Dígitos) - ainda são 4 casas decimais. É necessário reescrever todo o indicador em subprograma-função do Expert Advisor para obter 5 dígitos?

 

Ajuda: Alerta(), Comentário(), Imprimir()

Os dados do tipo duplo são emitidos com 4 dígitos decimais após o ponto.

Use o DoubleToStr() para emitir números com maior precisão.

 

Boa noite,

Eu não consigo lidar com o fechamento correto de posições. Há duas condições para fechar: 1. se uma posição estiver aberta; 2. se duas (ou mais posições) estiverem abertas. Em ambos os casos, o volume do lote = 0,03. No primeiro caso, o lote é fechado separadamente por 0,01 (trabalhado nos postos acima). No segundo caso, dois lotes devem ser fechados ambos até 0,03:

if (OrderType()==OP_BUY && BuyTotalOp==1)

então a primeira variante de fechamento e se:

if (OrderType()==OP_BUY && BuyTotalOp>1)

então a outra (na minha variante (preliminar) se a soma dos lucros de ambas as posições > 0, então ambas as posições devem ser fechadas). É o que parece:

   extern double Lots=0.03;           // Жестко заданное колич. лотов
.................................
   // Учёт количества имеющихся ордеров
   Symb=Symbol();                               // Название фин.инстр.
   BuyTotalOp=0;                                // Количество Buy ордеров
   SellTotalOp=0;                               // Количество Sell ордеров
   for (int i=1; i<=OrdersTotal(); i++)         // Цикл перебора ордер
      {
      if (OrderSelect( i-1, SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!= Symb)continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");
            return;                             // Выход из start()
           }
         if (OrderType()==OP_BUY)
           {
            BuyTotalOp++;                         // Счётчик ордеров Buy
......................................
   //Проверка если открыто несколько БАЙ-позиций
   if (OrderType()==OP_BUY && BuyTotalOp>1)        // Тип ордера бай и ордеров по циклу "с начала" = 1
     {
//....................................     
      //---- если условия закрытия нескольких лотов БАЙ
      if ( BuyOrdProf>0)
        {
         //---- закрываем 1-ю часть позиции
         Alert("Попытка закрыть Buy ", TicketCl,". Ожидание ответа..");
         RefreshRates();                            // Обновление данных
         Ans=OrderClose( CloseTicketCl, Lots,Bid,0,Red);          // Закрытие Buy
         if ( Ans==true)                             // Получилось :)
           { 
            Alert ("Закрыт ордер Buy ", TicketCl);
            break;                                  // Выход из цикла закр
           }
         if ( Fun_Error(GetLastError())==1)          // Обработка ошибок
            continue;                               // Повторная попытка
         return;                                    // Выход из start()
        }
     }
//.........................................
   //Проверка если открыта одна БАЙ-позиция
   if (OrderType()==OP_BUY && BuyTotalOp==1)        // Тип ордера бай и ордеров по циклу "с начала" = 1
     {
//....................................     
      //---- если условия закрытия одного лота БАЙ
      if ( BUYCLOSE_1PART && BuyClLot== Lots)
        {
         //---- закрываем 1-ю часть позиции
         Alert("Попытка закрыть Buy ", TicketCl,". Ожидание ответа..");
         RefreshRates();                            // Обновление данных
         Ans=OrderClose( CloseTicketCl, LotCloseBuy/3,Bid,0,Red);          // Закрытие Buy
         if ( Ans==true)                             // Получилось :)
           { 
            Alert ("Закрыт ордер Buy ", TicketCl);
            break;                                  // Выход из цикла закр
           }
         if ( Fun_Error(GetLastError())==1)          // Обработка ошибок
            continue;                               // Повторная попытка
         return;                                    // Выход из start()
        }
 

De fato, acontece que quando aparecem as condições de fechamento dos dois lotes, o primeiro lote fecha completamente, enquanto o segundo lote "assume" as condições de fechamento BuyTotalOp==1 e fecha de acordo com suas próprias condições.

Por favor, informe o que está errado com as condições de fechamento e como fazer os dois lotes fecharem de uma só vez. Obrigado de antemão.

 
Eu tentei tanto OrderTicket() como Lots contando e somando no loop de pedidos - sem sucesso... Talvez, como sempre, "a verdade esteja em algum lugar próximo", mas não se percebe...
 

Separar as moscas das costeletas... escrever algumas funções úteis...

Por exemplo, contar o número de ordens abertas por tipo de ordem, ordens fechadas por tipo de ordem, etc...

então tudo será mais fácil...

if ( ordersTotal( SYMBOL,OP_BUY)==1) closeAllOrders( SLIPPAGE, TRY, TRADESLEEP, SHOWERRORS, SYMBOL,OP_BUY);
if ( ordersTotal( SYMBOL,OP_BUY) > 1) closeAllOrders( SLIPPAGE, TRY, TRADESLEEP, SHOWERRORS, SYMBOL,OP_BUY);

...porque você tem uma ordem em falta } em algum lugar, e não fica claro o que exatamente está sendo feito... pode ser que você esteja tentando contar temporariamente o número de ordens e apagá-las imediatamente, ou o que ? ordens pendentes podem ser melhor ignoradas e não interrompidas quando elas existem ?

Uma boa opção seria uma função que, de acordo com determinadas condições, formaria uma matriz com parâmetros de ordens abertas que você pode executar e fechá-las ... em geral, trabalhar na estrutura ...

 

Obrigado Keekkenen, ultimamente tenho pensado em criar uma matriz. É que eu nunca trabalhei com ele e esperava que houvesse uma solução mais simples, que eu já tivesse um olho "fechado", e alguém com olhos frescos olhará para ele e dirá "cara, onde está sua contagem mais ou menos...". Bem, todas as ordens de compra do loop foram calculadas:

   // Учёт количества имеющихся ордеров от начала к концу
   Symb=Symbol();                               // Название фин.инстр.
   BuyTotalOp=0;                                // Количество Buy ордеров
   SellTotalOp=0;                               // Количество Sell ордеров
   for (int i=1; i<=OrdersTotal(); i++)         // Цикл перебора ордер
      {
      if (OrderSelect( i-1, SELECT_BY_POS)==true) // Если есть следующий
        {                                       // Анализ ордеров:
         if (OrderSymbol()!= Symb)continue;      // Не наш фин. инструм
         if (OrderType()>1)                     // Попался отложенный
           {
            Alert("Обнаружен отложенный ордер. Эксперт не работает.");
            return;                             // Выход из start()
           }
         if (OrderType()==OP_BUY)
           {
            BuyTotalOp++;                         // Счётчик ордеров Buy
....................................

e OrderClose não os conta...

   //Проверка если открыто несколько БАЙ-позиций
   if (OrderType()==OP_BUY && BuyTotalOp>1)        // Тип ордера бай и ордеров по циклу "с начала" = 1
     {
//....................................     
      //---- если условия закрытия нескольких лотов БАЙ
      if ( BuyOrdProf>0)
        {
         //---- закрываем 1-ю часть позиции
         Alert("Попытка закрыть Buy ", TicketCl,". Ожидание ответа..");
         RefreshRates();                            // Обновление данных
         Ans=OrderClose( CloseTicketCl, BuyTotalOp,Bid,0,Red);          // Закрытие Buy
...................................................................
bem, sim, é óbvio "overkill" .......
 

e francamente, eu não entendo isto.

Ans=OrderClose( CloseTicketCl, Lots,Bid,0,Red);          // Закрытие Buy

e esta, especialmente a divisão do lote por 3 ? o pedido é fechado com o mesmo lote que foi aberto...

Ans=OrderClose( CloseTicketCl, LotCloseBuy/3,Bid,0,Red);          // Закрытие Buy

por que não em ambos os casos ?

Ans=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Red);          // Закрытие Buy
 

por que não em ambos os casos ?

Ans=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0,Red);          // Закрытие Buy

CloseTicketCl = OrderTicket () em geral, você pode fazer isso...

e isto, especialmente dividindo o lote por 3 ?? o pedido é fechado com o mesmo lote que é aberto...

Ans=OrderClose( CloseTicketCl, LotCloseBuy/3,Bid,0,Red);          // Закрытие Buy

não é o mesmo

.

Um terço do lote está fechado (de acordo com uma das condições - digamos que o preço tenha atingido +150 pips). O segundo terceiro fechará, digamos, quando +300 pips da abertura, etc...

e francamente não entendo isto

Ans=OrderClose( CloseTicketCl, Lots,Bid,0,Red);          // Закрытие Buy
aqui Lotes e OrderLots() sim, a mesma coisa.
 
hope >> Não é a mesma coisa. Um terço do lote será fechado (de acordo com uma das condições - vamos supor que o preço tenha atingido +150 pontos). A segunda terceira fechará, digamos, quando +300 pips da abertura, etc.

Não, isso não vai funcionar. um pedido - um lote, se você abriu um pedido com 3 lotes, você não pode dividir o lote de forma alguma - primeiro 1, depois 1 e depois 1 - o pedido fecha o lote inteiro, ou seja, o pedido fecha com o mesmo lote que foi aberto, você não pode fechar os pedidos em partes...

Razão: