[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 665

 
Roger:
Non contare i massimi e i minimi dalla barra zero ma dalla prima barra, sulla barra zero il Bid non può essere inferiore al Min.
Cioè i=1; ? E lasciare Bid e Ask intatti?
 
eugggy:
doppio
Min=Bid, dichiarazione della variabile

Max=Offerta,

____________________________________________________________________________________________

for (i=0;i<=20-1;i++) criteri di apertura

{
se (Low[i]<Min) Min=Low[i]:
se (Alto[i]>Max) Max=Alto[i];

}

se (................. &&Ask>Max)

{

Opn_B=true; //aprire Buy

}

se (................ &&Bid<Min)

{

Opn_S=true; //aprire Vendere

}

___________________________________________________________________________________________

Mi dispiace che sia così brutto - ho dovuto scriverlo a memoria perché il codice non funzionava e l'ho cancellato. Ma tu, come professionista, dovresti essere comprensibile (spero).

____________________________________________________________________________________________

Mi lusinghi :)) Sono un principiante proprio come te...

extremumprice.mq4 
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
extern int  Quant_Bars  =30;                    // Количество баров
bool        OpnBuy      =false,
            OpnSell     =false;
//--------------------------------------------------------------------
int start()                                     // Спец. функция start
  {
   int i;                                       // Номер бара 
   double Minimum=Bid,                          // Минимальная цена
          Maximum=Bid;                          // Максимальная цена
 
   for(i=0;i<=Quant_Bars-1;i++)                 // От нуля (!) до..
     {                                          // ..Quant_Bars-1 (!)
      if (Low[i]< Minimum)                      // Если < известного
         Minimum=Low[i];                        // то оно и будет мин
      if (High[i]> Maximum)                     // Если > известного
         Maximum=High[i];                       // то оно и будет макс
     }
//--------------------------------------------------------------------

   if (iOpen(NULL,0,1)>Maximum)
      {
         OpnBuy =true:
         OpnSell=false;
      }
   if (iOpen(NULL,0,1)<Minimum)
      {
         OpnSell=true;
         OpnBuy =false:
      }   
//-------------------------------------------------------------------
//  А тут код открытия позиций.  if (OpnBuy)  {открываем Бай};
//                               if (OpnSell) {открываем Селл};
// Но обязательно нужно сделать проверку на существование уже открытой позиции,
// иначе они будут открываться на каждом тике пока присутствует сигнал...
   return;                                      // Выход из start()
  }
//--------------------------------------------------------------------
Va più o meno così. Non l'ho controllato, l'ho scritto su due piedi...
 
artmedia70:

Quindi ecco la logica:

1. impostare l'ordine pendente con un numero magico, diciamo 101, e resettare il flag per convertire l'ordine in una posizione, diciamo ConvOrd=false;

2. controllare se la posizione con la magia 101 è apparsa; in caso affermativo, impostare il flag di conversione ConvOrd=true;

3. Controllare ConvOrd per la verità e se ConvOrd==vero,
controlliamo se la posizione con il numero magico 101 esiste - e se manca
significa che è già chiuso.

{deselezionare ConvOrd=false; impostarne uno nuovo in sospeso;}.

Penso che possiamo fare a meno delle bandiere...


Capisco la logica, ma non so come implementarla nel codice. Ho provato molte varianti ma non ho ottenuto alcun risultato. Penso di essere un idiota. Ecco perché ho scritto qui. A pag. 663 vi ho mostrato il mio codice. Se sei interessato, per favore dimmi come migliorarlo o almeno dimmi come migliorarlo. Grazie.
 
artmedia70, Roger grazie per il tuo aiuto. Penso di aver capito, infatti il prezzo alla barra 0 non può essere inferiore o superiore al minimo e al massimo, non ci avevo pensato e ho aggiunto Ask come valore della variabile Min, ora sembra funzionare. artmedia70, rispetto a me, la maggior parte sono professionisti))). Grazie ancora.
 
dimon74:
Capisco la logica, ma non so come implementarla nel codice. Ho provato molte varianti ma non ho ottenuto alcun risultato. Penso di essere un idiota. Ecco perché ho scritto qui. A pag. 663 vi ho mostrato il mio codice. Se siete interessati, per favore ditemi come migliorarlo o almeno ditemi come migliorarlo. Grazie.

Prova un modo più semplice, quando metti un ordine SellStop, ricorda il valore TakeProfit e se il Bid scende sotto quel prezzo, mettilo su Buy.
 
Roger:

Prova un modo più semplice, quando metti un ordine SellStop, ricorda il valore TakeProfit e se il Bid scende sotto questo prezzo, mettilo su Buy.
Grazie per il suggerimento, ho già provato questa variante ma non è adatta alla mia strategia.
 
dimon74:
Grazie per il consiglio, ho già provato questa opzione ma non è adatta alla mia strategia.
Che i professionisti mi perdonino, ma ti darò comunque una lista di funzioni utili di Igor Kim, forse te la costruirai da solo... :)
File:
 

Non capisco perché ci sono due posizioni di chiusura contemporaneamente. La logica va così:

Quando il capitale raggiunge una certa percentuale del profitto precedente, chiudiamo tutte le posizioni... Questo funziona correttamente... Il prossimo...

Se il capitale scende di una certa percentuale dal suo valore precedente, cercate la posizione con la perdita maggiore, identificate chi è... Comprare o vendere.

e aprire una posizione di chiusura nella direzione opposta con doppio lotto. Poi guardiamo il loro profitto totale (della posizione perdente e bloccante) e appena diventa più grande,

Diciamo 10 pip, chiudiamoli...

Logicamente, l'equità dovrebbe essere controllata al prossimo tick e se tutto è OK, si continua a lavorare... Se tutto è di nuovo a posto, dovremo cercare il prossimo babbeo...

Ma per qualche motivo apre due posizioni di chiusura contemporaneamente... e Compra e Vendi, e se il lotto era 0,1, allora la prima chiusura apre il doppio del lotto = 0,2,

e il secondo lo raddoppia di nuovo e si apre con 0,4 lotto ... Rispettivamente, che diavolo di lotto c'è, se stanno combattendo tra di loro per un posto sotto il sole ... :(

Sto allegando il codice, forse qualcuno potrebbe punzecchiarmi con il suo... dito.

//----------------- Закрытие позиций если эквити выросло на N процентов ---------------------------
            
   if (Equ_NEW>=Equ_OLD+EquPerc)                       // Новое эквити больше старого на процент прибыли..
   {                                         
//      ClosePosBySizeLossInCurrency(NULL, -1, -1, 0); // Закрытие всех убыточных позиций
      ClosePosFirstProfit(NULL, -1, -1);           // Закрываем все позиции, сначала прибыльные
      DeleteOrders(NULL, -1, -1);                  // Удаляем ордера
      Equ_NEW=AccountEquity();                     // Запоминаем новое значение эквити
      Equ_OLD=Equ_NEW;                             // и вписываем его в "старое"
      CountClsEQU++;                               // Увеличиваем счётчик кол-ва закрытий для ф-ции вывода информации
      LockBuy51 =true;                             // Разрешаем открытие локирующих
      LockSell51=true;                             // позиций Buy и Sell
      OpnBuy51  =true;                             // и вообще разрешаем открываться
      OpnSell51 =true;                             // в любую сторону... 
   }

//------------- Включение вывода убыточных позиций в ноль, если эквити упало на N процентов -----------------------
               
   if (Equ_NEW<=Equ_OLD-EquPerc/2)                 // Новое эквити меньше старого на столько-то процентов...
      {                                         
         Trade=false;                              // Запрещаем торговлю
//-------------- Закрытие двух позиций, если ранее был установлен лок на убыточную ------------- 
        
         if (OrderSelect(TicketLoss, SELECT_BY_POS, MODE_TRADES))    // Выбираем убыточную позицию (если её тикет
            {                                                        // ранее был сохранён в TicketLoss)
               double prloss=OrderProfit()+OrderSwap();              // Размер профита убыточной позиции
               int typeloss =OrderType();                            // Тип убыточной позиции
               int mnloss   =OrderMagicNumber();                     // Magic убыточной позиции
            }
         if (OrderSelect(TicketLock, SELECT_BY_POS, MODE_TRADES))    // Выбираем локирующую позицию (если её тикет
            {                                                        // ранее был сохранён в TicketLock)
               double prlock=OrderProfit()+OrderSwap();              // Размер профита локирующей позиции
               int typelock =OrderType();                            // Тип локирующей позиции
            }
         if (prloss+prlock>=10*Point)                                // Если их суммарный профит больше 10 пунктов
            {
                ClosePositions(NULL, typelock, 5100);           // Закрываем локирующую позицию
               ClosePositions(NULL, typeloss, mnloss);         // Закрываем убыточную позицию
            }
//--------------- Поиск убыточной позиции и установка локирующей -------------------------  
       
         double Loss=0;                                        // Последнее значение убытка
         int    i, k=OrdersTotal(), OrdTicket=-1;

         for (i=k-1; i>=0; i--) {                              // Цикл по всем ордерам терминала
            if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
               if ((OrderProfit()+OrderSwap()<0)) {            // Если профит позиции меньше 0
                  if (Loss>OrderProfit()+OrderSwap()) {        // Если последнее значение убытка больше убытка позиции  
                     Loss=OrderProfit()+OrderSwap();           // Значит тут убыток больше, запоминаем как последнее
                     OrdTicket=i;                              // Запоминаем номер убыточной позиции
                  }
               }
            }
         }
            if (OrdTicket>=0) {
               if (OrderSelect(OrdTicket, SELECT_BY_POS, MODE_TRADES)) {   // Выбираем позицию по тикету
                  TicketLoss=OrdTicket;                                    // Запоминаем как тикет убыточной позы
                  if (OrderType()==OP_BUY)                                 // Если её тип Бай
                     {
                        Magic=5100;                                              // Задаём магик... 
                        New_Comm="Sell_M5_Стратегия_1_Локирующая позиция";       // Задаём комментарий для позиции
                        Lots_New=NormalizeLot(OrderLots()*2, False, NULL);       // Увеличим лот в два раза
                        if (!ExistPositions(NULL, OP_SELL, 5100, 0)){            // Если нет локирующего Sell
                        OpenPosition(NULL,OP_SELL,Lots_New,0,pb-tp*100*po,Magic,New_Comm);} // Открываем локирующий...
                        if (ExistPositions(NULL, OP_SELL, 5100, 0))              // Проверяем, заодно и выбираем её
                              {TicketLock=OrderTicket();}                        // Сохраняем тикет локирующего Sell
                     }
                  if (OrderType()==OP_SELL)
                     {
                        Magic=5100;                                              // Задаём магик... 
                        New_Comm="Buy_M5_Стратегия_1_Локирующая позиция";        // Задаём комментарий для позиции
                        Lots_New=NormalizeLot(OrderLots()*2, False, NULL);       // Увеличим лот в два раза
                        if (!ExistPositions(NULL, OP_BUY, 5100, 0)){             // Если нет локирующего Buy
                        OpenPosition(NULL,OP_BUY,Lots_New,0,pa+tp*100*po,Magic,New_Comm);} // Открываем локирующий...
                        if (ExistPositions(NULL, OP_BUY, 5100, 0))               // Проверяем, заодно и выбираем её
                              {TicketLock=OrderTicket();}                        // Сохраняем тикет локирующего Buy
                     }
               }
            }
         }

A partire da

//------------- Включение вывода убыточных позиций в ноль, если эквити упало на N процентов -----------------------

...c'è una canna da qualche parte...

 

PAGINA NUMERO "666" :-)

 
Spaventoso... Whoo!!!