Caratteristiche utili da KimIV - pagina 86

 

Igor, puoi darmi un suggerimento? Qualcosa dall'indicatore(iMA) nell'EA i valori vengono con 4 cifre decimali, mentre ho bisogno di 5 per lavorare! Ho provato NormalizeDouble(iMA,Digits) - è ancora 4 cifre decimali. È necessario riscrivere l'intero indicatore in sottoprogramma-funzione dell'Expert Advisor per ottenere 5 cifre?

 

Aiuto: Alert(), Comment(), Print()

I dati di tipo doppio vengono emessi con 4 cifre decimali dopo il punto.

Usate DoubleToStr() per produrre numeri con maggiore precisione.

 

Buona sera,

Non riesco a far fronte alla chiusura corretta delle posizioni. Ci sono due condizioni per la chiusura: 1. se una posizione è aperta; 2. se due (o più) posizioni sono aperte. In entrambi i casi, il volume del lotto = 0,03. Nel primo caso, il lotto viene chiuso separatamente da 0,01 (calcolato nei post sopra). Nel secondo caso, due lotti dovrebbero essere chiusi entrambi di 0,03. Corrispondentemente, se:

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

poi la prima variante di chiusura e se:

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

poi l'altra (nella mia variante (preliminare) se la somma dei profitti di entrambe le posizioni > 0, allora entrambe le posizioni dovrebbero essere chiuse). Sembra così:

   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()
        }
 

Infatti, si scopre che quando le condizioni di chiusura di entrambi i lotti appaiono, il primo lotto si chiude completamente, mentre il secondo lotto "assume" le condizioni di chiusura BuyTotalOp==1 e si chiude secondo le proprie condizioni.

Per favore consigliate cosa c'è di sbagliato nelle condizioni di chiusura e come fare per far chiudere entrambi i lotti in una volta sola? Grazie in anticipo.

 
Ho provato sia con OrderTicket() che con il conteggio dei lotti e l'aggiunta nel ciclo dell'ordine - senza risultato... Forse, come sempre, "la verità è vicina", ma non prende piede...
 

Separare le mosche dalle cotolette... scrivere alcune funzioni utili...

Per esempio, conta il numero di ordini aperti per tipo di ordine, gli ordini chiusi per tipo di ordine, ecc.

allora tutto sarà più facile...

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);

...perché hai un } mancante da qualche parte, e non è chiaro cosa si stia facendo esattamente...forse stai cercando di contare temporaneamente il numero di ordini e cancellarli immediatamente, o cosa? Gli ordini in sospeso potrebbero essere meglio saltati e non interrotti quando esistono?

Una buona opzione sarebbe una funzione che, in base a determinate condizioni, formasse un array con i parametri degli ordini aperti che si possono percorrere e chiudere ... in generale, lavorare sulla struttura ...

 

Grazie keekkenen, ultimamente ho pensato di creare un array. È solo che non ci ho mai lavorato e speravo che ci fosse una soluzione più semplice, che ho già un occhio "chiuso", e qualcuno con occhi freschi lo guarderà e dirà "cavolo, dov'è il tuo contare così e così...". Bene, tutti gli ordini di acquisto nel ciclo sono stati calcolati:

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

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

e francamente non lo capisco.

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

e questo, specialmente la divisione del lotto per 3 ? l'ordine è chiuso con lo stesso lotto che è stato aperto...

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

perché non in entrambi i casi?

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

perché non in entrambi i casi?

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

CloseTicketCl = OrderTicket () in generale si può fare così...

e questo, soprattutto dividendo il lotto per 3 ?? l'ordine viene chiuso con lo stesso lotto che viene aperto...

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

non è lo stesso

.

Un terzo del lotto è chiuso (secondo una delle condizioni - diciamo che il prezzo ha raggiunto +150 pip). Il secondo terzo chiuderà, diciamo, quando +300 pip dall'apertura, ecc.

e francamente non capisco questo

Ans=OrderClose( CloseTicketCl, Lots,Bid,0,Red);          // Закрытие Buy
qui Lotti e OrderLots() sì, la stessa cosa.
 
hope >> Non è lo stesso. Un terzo del lotto sarà chiuso (secondo una delle condizioni - supponiamo che il prezzo abbia raggiunto +150 punti). Il secondo terzo chiuderà, diciamo, quando +300 pips dall'apertura, ecc.

No, non funzionerà. un ordine - un lotto, se hai aperto un ordine con 3 lotti, non puoi dividere il lotto in nessun modo - prima 1, poi 1 e poi 1 - l'ordine chiude l'intero lotto, cioè l'ordine si chiude con lo stesso lotto con cui è stato aperto, non puoi chiudere ordini in parti...