[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 665

 
Roger:
Conte altos e baixos não a partir da barra zero, mas a partir da primeira barra, na barra zero a Licitação não pode ser menor que a Mínima.
Isto é, i=1; ? E deixar Bid and Ask into intoched?
 
eugggy:
duplo
Min=Licit, declaração variável

Max=Licit,

____________________________________________________________________________________________

para (i=0;i<=20-1;i++) critérios de abertura

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

}

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

{

Opn_B=verdadeiro; //abrir Compra

}

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

{

Opn_S=verdadeiro; //venda aberta

}

___________________________________________________________________________________________

Lamento que seja tão feio - tive que escrevê-lo de memória, pois o código não funcionou e eu o apaguei. Mas você, como profissional, deve ser compreensível (espero).

____________________________________________________________________________________________

Você me lisonjeia :)) Sou um principiante, como você...

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()
  }
//--------------------------------------------------------------------
É mais ou menos assim. Não o verificou, apenas o escreveu no local.
 
artmedia70:

Portanto, aqui está a lógica:

1. Defina a ordem pendente com um número mágico, digamos 101, e zere a bandeira para converter a ordem em uma posição, digamos ConvOrd=false;

2. verificar se a posição com a 101 mágica apareceu; em caso afirmativo, colocar a bandeira de conversão ConvOrd=true;

3. verificar se ConvOrd==verdadeiro,
verificamos se a posição com o número mágico 101 existe - e se está faltando
significa que já está fechado.

{deselecione ConvOrd=falso; defina um novo pendente;}.

Acho que podemos passar sem bandeiras...


Entendo a lógica, mas não sei como implementá-la em código. Eu tentei muitas variantes, mas não obtive nenhum resultado. Eu acho que sou um boneco. É por isso que eu escrevi aqui. Na p.663 eu lhe mostrei meu código. Se você estiver interessado, por favor, me diga como melhorá-lo ou pelo menos me diga como melhorá-lo. Obrigado.
 
artmedia70, Roger obrigado por sua ajuda. Acho que descobri, de fato o preço na barra 0 não pode ser inferior ou superior ao mínimo e máximo, não pensei nisso e acrescentei Ask como um valor de variável Min, agora parece funcionar. artmedia70, em comparação comigo, a maioria são profissionais))))) Mais uma vez, obrigado.
 
dimon74:
Entendo a lógica, mas não sei como implementá-la em código. Eu tentei muitas variantes, mas não obtive nenhum resultado. Eu acho que sou um boneco. É por isso que eu escrevi aqui. Na p.663 eu lhe mostrei meu código. Se você estiver interessado, por favor, me diga como melhorá-lo ou pelo menos me diga como melhorá-lo. Obrigado.

Tente uma maneira mais simples, quando fizer um pedido SellStop, lembre-se do valor do TakeProfit e se o Bid cair abaixo desse preço, coloque-o na Buy.
 
Roger:

Tente uma maneira mais simples, quando você fizer um pedido SellStop, lembre-se do valor TakeProfit e se o Bid cair abaixo deste preço, coloque-o na Buy.
Obrigado pela dica! Já tentei esta variante, mas não é adequada para minha estratégia.
 
dimon74:
Obrigado pelo conselho! Já tentei esta opção, mas ela não é adequada para minha estratégia.
Que os profissionais me perdoem, mas ainda lhe darei uma lista de funções úteis de Igor Kim, talvez você mesmo a construa... :)
Arquivos anexados:
 

Não entendo porque há duas posições de fechamento ao mesmo tempo. A lógica é a seguinte:

Quando o patrimônio atinge uma certa porcentagem do lucro anterior, fechamos todas as posições. Isto funciona corretamente... A seguir...

Se o patrimônio cair uma certa porcentagem de seu valor anterior, procure a posição com maior perda, identifique quem é... Comprar ou Vender...

e abrir uma posição de travamento na direção oposta com lote duplo. Depois olhamos para seu lucro total (da posição de perda e travamento) e assim que ele se torna maior,

Digamos 10 pips, feche-os...

Logicamente, a equidade deve ser verificada no próximo tick e, se tudo estiver bem, continuamos trabalhando... Se tudo estiver bem novamente, teremos de procurar o próximo otário.

Mas, por alguma razão, abre duas posições de fechamento ao mesmo tempo. e Comprar e Vender, e se o lote foi 0,1, então o primeiro travamento abre o dobro do lote = 0,2,

e a segunda dobra-o novamente e abre com 0,4 lote ... Respectivamente, que diabos está ali, se estão lutando uns com os outros por um lugar sob o Sol ... :(

Estou anexando o código, talvez alguém possa me cutucar com seu... 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 процентов -----------------------

...há uma junta em algum lugar...

 

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

 
Assustador... Whoo!!!
Razão: