Установка цели по Фибо

 
Нужен наглядный пример

Задача ,поставить  тейк  по  уровням фибо , переделать готовую функцию
Условие:
если открылась покупка  , берем хай  третей свечи -это первая координата  для фибо ,вторая  координата лоу перовой свечи
если открылась продажа ,  лоу первой  свечи -это первая координата  , хай третей  - вторая


input uint                     i_nSL         = 20;                                                                                      
input uint                     i_nTP         = 168;                                                                                    

bool InitialSLTP(const string sSymbol, const int nSL = 0, const int nTP = 0)
{      
        // возвращаемое значение, указывающее на успешность выполнения функции
        bool bRetVal = false;
        
        if(PositionSelect(sSymbol) == true)
        {
                // параметры открытой позиции, к которой нужно выставить СЛ и (или) ТП
                ENUM_POSITION_TYPE ePositionType = (ENUM_POSITION_TYPE) PositionGetInteger(POSITION_TYPE);
                double fOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN);
                double fSL = PositionGetDouble(POSITION_SL);
                double fTP = PositionGetDouble(POSITION_TP);
                double fPoint = SymbolInfoDouble(sSymbol, SYMBOL_POINT);
                int nDigits = (int) SymbolInfoInteger(sSymbol, SYMBOL_DIGITS);
                
                // если ТП и СЛ уже выставлены, или же не требуются, то выходим
                if((fTP > 0 || nTP == 0) && (fSL > 0 || nSL == 0))
                        return(false);
                        
                // цена самой первой сделки позиции (цена её открытия) - от неё откладываем СЛ и ТП
                double fFirstDealPrice = 0;
                
                if(HistorySelectByPosition(PositionGetInteger(POSITION_IDENTIFIER)) == true)
                {
                        int nTotalDeals = HistoryDealsTotal();
                        
                        ulong nDealTicket = HistoryDealGetTicket(0);
                        
                        fFirstDealPrice = HistoryDealGetDouble(nDealTicket, DEAL_PRICE);
                }
                        
                double fNewSL = 0;
                double fNewTP = 0;
                
                if(ePositionType == POSITION_TYPE_BUY)
                {
                        if(fSL > 0)
                                fNewSL = fSL;
                        else
                        {
                                if(nSL > 0)
                                        fNewSL = fFirstDealPrice - nSL * fPoint;
                                        
                                if(fNewSL < 0)
                                        fNewSL = 0;
                        }
                        
                        if(fTP > 0)
                                fNewTP = fTP;
                        else
                        {
                                if(nTP > 0)
                                        fNewTP = fOpenPrice + nTP * fPoint;
                        }
                }

                if(ePositionType == POSITION_TYPE_SELL)
                {
                        if(fSL > 0)
                                fNewSL = fSL;
                        else
                        {
                                if(nSL > 0)
                                        fNewSL = fOpenPrice + nSL * fPoint;
                        }
                        
                        if(fTP > 0)
                                fNewTP = fTP;
                        else
                        {
                                if(nTP > 0)
                                        fNewTP = fOpenPrice - nTP * fPoint;
                                        
                                if(fNewTP < 0)
                                        fNewTP = 0;
                        }
                }

                // запрос
                MqlTradeRequest oRequest = {0};
                MqlTradeResult   oResult = {0};
                
                oRequest.action                 = TRADE_ACTION_SLTP;
                oRequest.symbol                 = sSymbol;
                oRequest.sl                                     = NormalizeDouble(fNewSL, nDigits);
                oRequest.tp                                     = NormalizeDouble(fNewTP, nDigits);

                // проверка перед отправкой
                MqlTradeCheckResult oCheckResult= {0};
                
                bool bCheck = OrderCheck(oRequest, oCheckResult);

                Print("Проверка заявки InitialSLTP:",
                                " OrderCheck = ",               bCheck,
                                ", retcode = ",         oCheckResult.retcode,
                                ", balance = ",         NormalizeDouble(oCheckResult.balance, 2),
                                ", equity = ",                  NormalizeDouble(oCheckResult.equity, 2),
                                ", margin = ",                  NormalizeDouble(oCheckResult.margin, 2),
                                ", margin_free = ",     NormalizeDouble(oCheckResult.margin_free, 2),
                                ", margin_level = ",    NormalizeDouble(oCheckResult.margin_level, 2),
                                ", comment = ",         oCheckResult.comment);
        
                // если проверка удачная - отправка заявки
                if(bCheck == true && oCheckResult.retcode == 0)
                {
                        bool bResult = false;
                        
                        // 3 попытки изменения позиции с интервалом 250 мс.
                        for(int k = 0; k < 3; k++)
                        {
                                bResult = OrderSend(oRequest, oResult);
                                
                                if(bResult == true && oResult.retcode == TRADE_RETCODE_DONE)
                                        break;
                                
                                if(k == 2)
                                        break;
                                        
                                Sleep(1000);
                        }
                
                        Print("Отправка заявки:",
                                        " OrderSend = ",        bResult,
                                        ", retcode = ", oResult.retcode,
                                        ", deal = ",            oResult.deal,
                                        ", order = ",           oResult.order,
                                        ", volume = ",          NormalizeDouble(oResult.volume, 2),
                                        ", price = ",           NormalizeDouble(oResult.price, _Digits),
                                        ", bid = ",                     NormalizeDouble(oResult.bid, _Digits),
                                        ", ask = ",                     NormalizeDouble(oResult.ask, _Digits),
                                        ", comment = ", oResult.comment,
                                        ", request_id = ",oResult.request_id);  
                                        
                        if(oResult.retcode == TRADE_RETCODE_DONE)
                                bRetVal = true;
                }
        }
        
        return (bRetVal);
}
 
Люди, как найти значения цены   на линейки фибо для  ТП например 160 ?



// Функция первоначального выставления Fibo текпрофита.
bool InitialTPFibo(const string sSymbol, const int nTP = 0)
{      
        // возвращаемое значение, указывающее на успешность выполнения функции
        bool bRetVal = false;
        if(PositionSelect(sSymbol) == true)
        {
                // параметры открытой позиции, к которой нужно выставить  ТП
                ENUM_POSITION_TYPE ePositionType = (ENUM_POSITION_TYPE) PositionGetInteger(POSITION_TYPE);
                double fOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN);
                double fTP = PositionGetDouble(POSITION_TP);
                double fPoint = SymbolInfoDouble(sSymbol, SYMBOL_POINT);
      int nDigits=(int) SymbolInfoInteger(sSymbol,SYMBOL_DIGITS);
    
   double fLow[],fHigh[];              // Создадим массив  значение Low/High
   CopyLow(_Symbol,_Period,0,5,fLow);  //Cкопируем в него текущее значение Low
   ArraySetAsSeries(fLow,true);        //Доступ к скопированным данным как к таймсериям
   CopyHigh(_Symbol,_Period,0,5,fHigh);//Cкопируем в него текущее значение High
   ArraySetAsSeries(fHigh,true);       //Доступ к скопированным данным как к таймсериям
   datetime fTime[];                   //Создадим массив  время открытия для  последних баров
   CopyTime(Symbol(),0,0,5,fTime);     //Скопируем время открытия
   ArraySetAsSeries(fTime,true);       //Доступ к скопированным данным как к таймсериям
   //hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
   double   fleve = ObjectGetDouble(0,"Fibo",OBJPROP_LEVELVALUE,1); // это дает  уровень Фибо-объекта
   double   fiboprice = ObjectGetDouble(0,"Fibo",OBJPROP_PRICE,1);  //это дает цену на уровне Фибо-объекта
        if(fTP > 0 || nTP == 0)    // если ТП и СЛ уже выставлены, или же не требуются, то выходим
                        return(false);  
                                
        double fNewTP = 0;
                if(ePositionType == POSITION_TYPE_BUY)
                {      
            double   price1=fHigh[3];//--- координаты первой точки привязки Фибо-объекта
            datetime time1=fTime[3];
            double   price2=fLow[1];//--- координаты первой точки привязки Фибо-объекта
            datetime time2=fTime[1];                    
            bool created=ObjectCreate(0,"Fibo",OBJ_FIBO,0,time1,price1,time2,price2);//сам Фибо-объект
                  if(fTP > 0)
                                fNewTP = fTP;
                        else
                        {
                            
                                if(nTP > 0)
                                        fNewTP = fOpenPrice + nTP ;////////////// * fPoint;???????????????
                        }
                }

                if(ePositionType == POSITION_TYPE_SELL)
                {              
            double   price1=fHigh[1];//--- координаты первой точки привязки Фибо-объекта
            datetime time1=fTime[1];
            double   price2=fLow[3];//--- координаты первой точки привязки Фибо-объекта
            datetime time2=fTime[3];                    
            bool created=ObjectCreate(0,"Fibo",OBJ_FIBO,0,time1,price1,time2,price2);//сам Фибо-объек
                        if(fTP > 0)
                                fNewTP = fTP;
                        else
                        {
                                if(nTP > 0)
                                        fNewTP = fOpenPrice - nTP ;////////////////* fPoint;??????????????????
                                        
                                if(fNewTP < 0)
                                        fNewTP = 0;
                        }
                }

                // запрос
 

Alexander Antoshkin:
Люди, как найти значения цены   на линейки фибо для  ТП например 160 ?


цена1 - (цена1 - цена2) / 100 * 160

где цена1 и цена2 - точки привязки фибо

 
Taras Slobodyanik:


цена1 - (цена1 - цена2) / 100 * 160

где цена1 и цена2 - точки привязки фибо

Действительно, незачем   здесь  все эти объекты и время

double   fleve = ObjectGetDouble(0,"Fibo",OBJPROP_LEVELVALUE,1); // это дает  уровень Фибо-объекта

 double   fiboprice = ObjectGetDouble(0,"Fibo",OBJPROP_PRICE,1);  //это дает цену на уровне Фибо-объекта

bool created=ObjectCreate(0,"Fibo",OBJ_FIBO,0,time1,price1,time2,price2);//сам Фибо-объект

достаточно знать  цену у бара..

В таком  варианте по вашей логике для Buy 

fNewTP = (fHigh[3]-((fHigh[3]-fLow[1]))/100 )*168 ;

Проверяем это условие в тестере......



что то не то в этой формуле...





 
Alexander Antoshkin:
что то не то в этой формуле...

а так?

цена точки 0% - (цена точки 0% - цена точки 100%) / 100 * 168

 

пс. а зачем вы добавили общие скобки? 

(fHigh[3]-((fHigh[3]-fLow[1]))/100 )*168  

 
Taras Slobodyanik:

а так?

цена точки 0% - (цена точки 0% - цена точки 100%) / 100 * 168

 

пс. а зачем вы добавили общие скобки? 

(fHigh[3]-((fHigh[3]-fLow[1]))/100 )*168  

fNewTP = (261.8*(fHigh[3]-fLow[1])/100) +fLow[1] ;

Умножаем на разницу между ценами нулевого и первого уровней /100 и прибавляем к цене нулевого уровня....

тогда все сходится с тестером



чтобы отобразить   линейку   в советнике  набросал   две функции

// ================================
bool FiboSell()
{
   bool bSignal=false;
    
   double fLow[],fHigh[];              // Создадим массив  значение Low/High
   CopyLow(_Symbol,_Period,0,5,fLow);  //Cкопируем в него текущее значение Low
   ArraySetAsSeries(fLow,true);        //Доступ к скопированным данным как к таймсериям
   CopyHigh(_Symbol,_Period,0,5,fHigh);//Cкопируем в него текущее значение High
   ArraySetAsSeries(fHigh,true);       //Доступ к скопированным данным как к таймсериям
   datetime fTime[];                   //Создадим массив  время открытия для  последних баров
   CopyTime(Symbol(),0,0,5,fTime);     //Скопируем время открытия
   ArraySetAsSeries(fTime,true);       //Доступ к скопированным данным как к таймсериям
  
            double   price1=fLow[1];//--- координаты первой точки привязки Фибо-объекта
            datetime time1=fTime[1];
            double   price2= fHigh[3];//--- координаты первой точки привязки Фибо-объекта
            datetime time2=fTime[3];           
               ObjectCreate(0,"Fibo",OBJ_FIBO,0,time1,price1,time2,price2);//сам Фибо-объект   
    return(bSignal);
}
// ================================
bool FiboBuy()
{
   bool bSignal=false;
    
   double fLow[],fHigh[];              // Создадим массив  значение Low/High
   CopyLow(_Symbol,_Period,0,5,fLow);  //Cкопируем в него текущее значение Low
   ArraySetAsSeries(fLow,true);        //Доступ к скопированным данным как к таймсериям
   CopyHigh(_Symbol,_Period,0,5,fHigh);//Cкопируем в него текущее значение High
   ArraySetAsSeries(fHigh,true);       //Доступ к скопированным данным как к таймсериям
   datetime fTime[];                   //Создадим массив  время открытия для  последних баров
   CopyTime(Symbol(),0,0,5,fTime);     //Скопируем время открытия
   ArraySetAsSeries(fTime,true);       //Доступ к скопированным данным как к таймсериям
  
               double   price1=fHigh[3];//--- координаты первой точки привязки Фибо-объекта
            datetime time1=fTime[3];
            double   price2=fLow[1];//--- координаты первой точки привязки Фибо-объекта
            datetime time2=fTime[1];           
            ObjectCreate(0,"Fibo",OBJ_FIBO,0,time1,price1,time2,price2);//сам Фибо-объект
      
    return(bSignal);
}

Она абсолютно не нужна и служит  лишь для этого теста
вызываю ее при установке  ордера  FiboSell();   FiboSell(); и и удаляю кода сделки нет ObjectsDeleteAll(0,0,OBJ_FIBO);
 
далее  Установка  фибы  по фракталам , непонятно...

пишу функцию  пытаюсь отрисовать  линейку

  в данном случае  мне нужен  первый верхний и первый  нижний  фрактал
что  в функции не так, почму не устанавливает?
bool FiboBuy()
{
   bool bSignal=false;
  int g_Fractal=iFractals(_Symbol, _Period);
   double Ups[],Downs[];// фракал
   datetime Time[];
   CopyBuffer(g_Fractal,0,0,10,Ups);
   CopyBuffer(g_Fractal,0,0,10,Downs);
   CopyTime(_Symbol,_Period,0,10,Time);
         //--- установим для массивов признак таймсерии
   ArraySetAsSeries(Ups,true);
   ArraySetAsSeries(Downs,true);
   ArraySetAsSeries(Time,true);
  
            double   price1=Ups[1];//--- координаты первой точки привязки Фибо-объекта
            datetime time1=Time[3];
            double   price2=Downs[1];//--- координаты первой точки привязки Фибо-объекта
            datetime time2=Time[10];                    
            ObjectCreate(0,"Fibo",OBJ_FIBO,0,time1,price1,time2,price2);//сам Фибо-объект

        return(bSignal);
}
 
в Ups[1] и Downs[1] есть цена?
Скорее всего там пустые значения. Фракталы нужно еще найти.
 
Taras Slobodyanik:
в Ups[1] и Downs[1] есть цена?
Скорее всего там пустые значения. Фракталы нужно еще найти.
А как проще их найти?
по идеи в Ups[1] и Downs[1должна быть цена  найденная индикатором фрактала..... или я что то не правильно понял?
например:
int priceUps; // это количество штуковин High индикатора фрактал
 int priceDowns;// это количество штуковин Low индикатора фрактал

  priceUps =  CopyBuffer(g_Fractal,0,0,10,Ups); // скопировали 10 десять значений   фрактала High
  priceDowns= CopyBuffer(g_Fractal,0,0,10,Downs);// скопировали 10 десять значений  нижнего фрактала Low
 

по идеи в Ups[1] и Downs[1]  должна быть цена  найденная индикатором фрактала..... или я что то не правильно понял?

в буферах будут значения последних 10-ти баров,
если на баре 1 нет фрактала, то в буфере [1] будет пустое значение (или ноль),
если на баре 1 есть фрактал, тогда в этой ячейке будет цена где установлен фрактал

То есть нужно перебирать массивы (Ups Downs) в поисках последних (крайних) фракталов - верхнего и нижнего.

 
Taras Slobodyanik:

в буферах будут значения последних 10-ти баров,
если на баре 1 нет фрактала, то в буфере [1] будет пустое значение (или ноль),
если на баре 1 есть фрактал, тогда в этой ячейке будет цена где установлен фрактал

То есть нужно перебирать массивы (Ups Downs) в поисках последних (крайних) фракталов - верхнего и нижнего.

Это же надо еще  с временем бара как то связать...

Вы можете просто написать пример и расписать  по строчно  функцию