Funciones útiles de KimIV - página 86

 

Igor, ¿puedes darme una pista? ¡Algo del indicador(iMA) en el EA los valores vienen con 4 decimales, mientras que yo necesito 5 para trabajar! He probado NormalizeDouble(iMA,Digits) - sigue siendo 4 decimales. ¿Es necesario reescribir todo el indicador en un subprograma-función del Asesor Experto para obtener 5 dígitos?

 

Ayuda: Alert(), Comment(), Print()

Los datos de tipo doble se emiten con 4 dígitos decimales después del punto.

Utilice DoubleToStr() para obtener números con mayor precisión.

 

Buenas noches,

No puedo hacer frente al cierre correcto de las posiciones. Hay dos condiciones para el cierre: 1. si una posición está abierta; 2. si dos (o más posiciones) están abiertas. En ambos casos, el volumen del lote = 0,03. En el primer caso, el lote se cierra por separado en 0,01 (calculado en los posts anteriores). En el segundo caso, dos lotes deben cerrarse ambos por 0,03. En consecuencia, si:

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

entonces la primera variante de cierre y si:

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

entonces la otra (en mi variante (preliminar) si la suma de los beneficios de ambas posiciones > 0, entonces ambas posiciones deben cerrarse). Se ve así:

   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 hecho, resulta que cuando aparecen las condiciones de cierre de ambos lotes, el primer lote se cierra completamente, mientras que el segundo lote "toma" las condiciones de cierre BuyTotalOp==1 y se cierra según sus propias condiciones.

Por favor, indíqueme qué es lo que falla en las condiciones de cierre y cómo hacer que los dos lotes se cierren a la vez. Gracias de antemano.

 
He probado tanto con OrderTicket() como con Lots counting y plusing en el bucle de pedido - sin éxito... Tal vez, como siempre, "la verdad está en algún lugar cerca", pero no se contagia...
 

Separar las moscas de las chuletas... escribir algunas funciones útiles...

Por ejemplo, contar el número de órdenes abiertas por tipo de orden, cerrar órdenes por tipo de orden, etc.

entonces todo será más 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 falta un } en alguna parte, y no queda claro qué es lo que se está haciendo exactamente... puede ser que esté tratando de contar temporalmente el número de órdenes y borrarlas inmediatamente, o qué ? las órdenes pendientes podrían ser mejor omitidas y no interrumpidas cuando existen ?

Una buena opción sería una función que, según unas condiciones dadas, formara un array con los parámetros de las órdenes abiertas que puede recorrer y cerrarlas... en general, trabajar sobre la estructura...

 

Gracias keekkenen, últimamente he estado pensando en crear una matriz. Es que nunca he trabajado con él y esperaba que hubiera una solución más sencilla, que ya tengo el ojo "cerrado", y alguien con ojos frescos lo mirará y dirá "caramba, dónde está tu cuenta fulana...". Bueno, todas las órdenes de compra en el bucle se han calculado:

   // Учёт количества имеющихся ордеров от начала к концу
   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
....................................

y OrderClose no los cuenta...

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

y francamente, no entiendo esto.

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

y este, especialmente la división del lote por 3€ la orden se cierra con el mismo lote que se abrió...

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

¿por qué no en ambos casos?

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

¿por qué no en ambos casos?

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

CloseTicketCl = OrderTicket () en general se puede hacer esto...

y esto, sobre todo dividiendo el lote por 3... la orden se cierra con el mismo lote que se abre...

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

no es lo mismo

.

Un tercio del lote está cerrado (según una de las condiciones - digamos que el precio ha alcanzado +150 pips). El segundo tercio se cerrará, digamos, cuando haya +300 pips desde la apertura, etc.

y francamente no entiendo este

Ans=OrderClose( CloseTicketCl, Lots,Bid,0,Red);          // Закрытие Buy
aquí Lots y OrderLots() sí, la misma cosa.
 
hope >> No es lo mismo. Un tercio del lote se cerrará (según una de las condiciones - supongamos que el precio ha alcanzado +150 puntos). El segundo tercio se cerrará, digamos, cuando haya +300 pips desde la apertura, etc.

No, eso no funcionará. una orden - un lote, si has abierto una orden con 3 lotes, no puedes dividir el lote como quieras - primero 1, luego 1 y luego 1 más - la orden cierra todo el lote, es decir, la orden se cierra con el mismo lote con el que se abrió, no puedes cerrar órdenes por partes...