[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 3

 

ой :-)

спасибо!

 

Здравствуйте знатоки!

Вот советник. он открывает позицию по фраактала вверх\вниз. Как сделать чтобы стоп находился на 5 п. выше (если BUY), и на 5 п. ниже (если SELL) от вершины фрактала???

P_up0=iCustom(0,0,"Ценовой канал",Chperiod,0,0);
   P_down0=iCustom(0,0,"Ценовой канал",Chperiod,1,0);
   P_up1=iCustom(0,0,"Ценовой канал",Chperiod,0,1);
   P_down1=iCustom(0,0,"Ценовой канал",Chperiod,1,1);
   Up=iCustom(0,0,"olyakish_fractals_02(для Skonti)",15,150,"Процент для отсеивания по объему",110,1,3);
   Down=iCustom(0,0,"olyakish_fractals_02(для Skonti)",15,150,"Процент для отсеивания по объему",110,3,3);
//задали все данные 

   total=OrdersTotal();
   if(total<1) 
     {
      // Проверка свободной маржи
      if(AccountFreeMargin()<(1000*Lots))
        {
         Print("We have no money. Free Margin = ", AccountFreeMargin());
         return(0);  
        }
      // Условие открытие позиции BUY
      if(Up>Down)
        {
         Lots=GetSizeLot();
         ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"",16384,0,Green);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
           }
         else Print("Error opening BUY order : ",GetLastError()); 
         return(0); 
        }
      // Условие открытие позиции SELL
      if(Up<Down)
        {
         Lots=GetSizeLot();
         ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"",16384,0,Red);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
           }
         else Print("Error opening SELL order : ",GetLastError()); 
         return(0); 
        }
      return(0);
     }
    
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   
         OrderSymbol()==Symbol())  
        {
         if(OrderType()==OP_BUY)   // длинная позиция открыта
           {
            // условие закрытие длинной позиции
            if(P_down1>P_down0||Up<Down)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }
            if(TrailingStop>0)  
              {                  
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop && OrderStopLoss()!=OrderOpenPrice()+X*Point)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+X*Point,OrderTakeProfit(),0,Green);
                     return(0);
                    }
                 }
              }
           }
         else 
           {
            // условие закрытия короткой позиции
            if(P_up1<P_up0||Up>Down)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
            if(TrailingStop>0)  
              {               
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if(NormalizeDouble(OrderStopLoss(),Digits) != NormalizeDouble(OrderOpenPrice()-X*Point,Digits))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-X*Point,OrderTakeProfit(),0,Red);
                     return(0);
                    }
                 }
              }
           }
        }
     }
   return(0);
  }

Здесь я использовал Ценовой канал.

// условие закрытия короткой позиции
            if(P_up1<P_up0||Up>Down)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); 
               return(0); 
              }
и
// условие закрытие длинной позиции
            if(P_down1>P_down0||Up<Down)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
                 return(0); 
                }

У меня вызывает затруднение обозначить L или H фрактала по которому открылась позиция!   

примерно так?!!??

if (NormalizeDouble (MathAbs (High [i]-5),Digits) < Price)
 
цена какого инструмента равнa=5?
if (NormalizeDouble (MathAbs (High [i]-5),Digits) < Price)

поэтому умножаем на цену младшего разряда

5*Point
 

Здесь я ошибся. Спасибо.

На как задать вершину фрактала по которому открылась позиция????

 
все вопросы разрешаем экспериментом - пишем скрипт, запyскаем,
- видим следующие отличия стандартного iFractals()
1. Индикатор по индексу фрактала в точности равен Хай/Лоу
2. несуществующее значение фрактала ==0
int i;
   double f;
   for(i=0;i<50;i++) {f=iFractals(NULL,0,MODE_UPPER,i); if(f!=0) break;}
 Alert(f,"  ",High[i]," i=",i);
P.S. ищем назад от позиции этим циклом, на моментоткрытия позиции, запоминаем
datetime timeFractalOnOpenPos=Time[i]
 
не пойму как это отобразить в советнике. при условии открытии позиции запоминать данный фрактал. как тогда его вызвать в условии закрытии?
 
непонятно что значит вызвать,
в глобальных переменных программы
-запомнили время бара фрактала открытия позиции, по времени бара через iBars() знаем номер бара
-запомнили цену фрактала
-запомнили вверх/вниз
и что тогда вызывать еще раз?
 
вызможно я не так выразился. просто я не представляю как это закодировать.
 
уточним - сколько ордеров и каких в каждую сторону?
 

выше всех блоков

double UfractalBuy,LfractalBuy;

записываем ближайший фрактал при открытии ордера бай

int i; double f;

     if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
            {
            Print("BUY order opened : ",OrderOpenPrice());
  
   for(i=0;i<50;i++) {f=iFractals(NULL,0,MODE_UPPER,i); if(f!=0) break;}
   UfractalBuy=High[i];
   for(i=0;i<50;i++) {f=iFractals(NULL,0,MODE_LOWER,i); if(f!=0) break;}
   LfractalBuy=Low[i];
            }
           }

вводим еще одно условие зарытия ордера бай

if(P_down1>P_down0||Up<Down||Close[0]+5*Point<LfractalBuy)
Причина обращения: