[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 665

 
Roger:
No cuente los máximos y mínimos desde la barra cero sino desde la primera barra, en la barra cero la Oferta no puede ser menor que el Mínimo.
Es decir, i=1; ? ¿Y dejar sin tocar la oferta y la demanda?
 
eugggy:
doble
Min=Bid, declaración de variables

Max=Oferta,

____________________________________________________________________________________________

for (i=0;i<=20-1;i++) criterios de apertura

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

}

si (................. &&Ask>Max)

{

Opn_B=true; //abrir Buy

}

si (................ &&Bid<Min)

{

Opn_S=true; //abrir Venta

}

___________________________________________________________________________________________

Siento que sea tan feo, lo he tenido que escribir de memoria ya que el código no funcionaba y lo he borrado. Pero tú, como profesional, deberías ser comprensible (espero).

____________________________________________________________________________________________

Me halagas :)) Soy un principiante como tú...

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()
  }
//--------------------------------------------------------------------
Es algo así. No lo comprobé, sólo lo escribí en el momento...
 
artmedia70:

Así que esta es la lógica:

1. Establecer la orden pendiente con un número mágico, digamos 101, y restablecer la bandera para convertir la orden en una posición, digamos ConvOrd=false;

2. comprobar si la posición con la magia 101 ha aparecido; si es así, establecer la bandera de conversión ConvOrd=true;

3. Comprobar la verdad de ConvOrd y si ConvOrd==true,
comprobamos si la posición con número mágico 101 existe - y si falta
significa que ya está cerrado.

{deseleccionar ConvOrd=false; establecer una nueva pendiente;}.

Creo que podemos prescindir de las banderas...


Entiendo la lógica, pero no sé cómo implementarla en código. He probado muchas variantes pero no he conseguido ningún resultado. Creo que soy un tonto. Por eso escribí aquí. En la página 663 te mostré mi código. Si te interesa, por favor, dime cómo mejorarlo o al menos dime cómo mejorarlo. Gracias.
 
artmedia70, Roger gracias por tu ayuda. Creo que lo he solucionado, efectivamente el precio en la barra 0 no puede ser menor o mayor que el mínimo y el máximo, no pensé en eso y añadí Ask como valor de la variable Min, ahora parece que funciona. artmedia70, comparado conmigo, la mayoría son profesionales)). Gracias de nuevo.
 
dimon74:
Entiendo la lógica, pero no sé cómo implementarla en código. He probado muchas variantes pero no he conseguido ningún resultado. Creo que soy un tonto. Por eso escribí aquí. En la página 663 te mostré mi código. Si te interesa, por favor, dime cómo mejorarlo o al menos dime cómo mejorarlo. Gracias.

Pruebe una forma más sencilla, cuando ponga una orden SellStop, recuerde el valor del TakeProfit y si el Bid cae por debajo de ese precio, póngalo en Buy.
 
Roger:

Pruebe una forma más sencilla, cuando ponga una orden SellStop, recuerde el valor TakeProfit y si la Oferta cae por debajo de este precio, póngala en Compra.
Gracias por el consejo! Ya he probado esta variante pero no es adecuada para mi estrategia.
 
dimon74:
Gracias por el consejo! Ya he probado esta opción pero no es adecuada para mi estrategia.
Que me perdonen los profesionales, pero aún así te daré una lista de funciones útiles de Igor Kim, tal vez lo construyas tú mismo... :)
Archivos adjuntos:
 

No entiendo por qué hay dos posiciones de bloqueo a la vez. La lógica es la siguiente:

Cuando la equidad alcanza un determinado porcentaje del beneficio anterior, cerramos todas las posiciones... Esto funciona correctamente... Siguiente...

Si la renta variable cae en un determinado porcentaje respecto a su valor anterior, busca la posición con mayor pérdida, identifica quién es... Comprar o vender...

y abrir una posición de bloqueo en sentido contrario con doble lote. Entonces miramos su beneficio total (de la posición perdedora y de la posición de bloqueo) y en cuanto se hace más grande,

Digamos 10 pips, cerrarlos...

Lógicamente, la equidad debe comprobarse en el siguiente tick y si todo está bien, seguimos trabajando... Si todo vuelve a estar bien, habrá que buscar al próximo imbécil...

Pero por alguna razón abre dos posiciones de cierre a la vez... y Compra y Venta, y si el lote era de 0,1, entonces el primer cierre abre el doble del lote = 0,2,

y el segundo lo duplica de nuevo y abre con 0,4 de lote ... Respectivamente, qué diablos de lote hay, si se están peleando entre ellos por un lugar bajo el Sol... :(

Adjunto el código, tal vez alguien pueda hurgar con su... dedo.

//----------------- Закрытие позиций если эквити выросло на 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 partir de

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

...hay un antro en alguna parte...

 

PÁGINA NÚMERO "666" :-)

 
Asusta... ¡¡¡Whoo!!!