Расчёт лота по фибо.

 

1) Строится фибо.

2) Пусть, гипотетически, мы можем выставить только один лимитный ордер на уровне 61,8 с размером лота 0,1(задаётся) и SL=MathAbs(начальная точка построения фибо - уровень 61,8).

3) Разбиваем этот один лот(0,1) на 3 части(x1, x2, x3) и разносим лимитные ордера по уровням: 38.2 - x1, 50.0 - x2, 61.8 - x3

4) Как расчитать размеры x1, x2, x3, если максимальный совокупный убыток (одщий SL этих трёх позиций) равен максимальному убытку гипотетической позиции с п.2

Не подскажите, может что-то подобное есть в открытом доступе, или как пощитать эти x1, x2, x3.

 
sv.:

Не подскажите, может что-то подобное есть в открытом доступе, или как пощитать эти x1, x2, x3.

Пощитать не надо, по вашим условиям получается x1=0, x2=0, x3=0.1.
 

Предположительно должно быть что-то типа этого:

x1=0.01, x2=0.03, x3=0.06 (в сумме дают базовый лот 0,1) и совокупные потери при разбивке = потерям от одного базового ордера.

Не соображу пока никак, как формализовать.

 
Без привязки к фибо уровням.
Появилось событие А(сигнал), после этого сигнала ищется точка входа. Суть в том, чтобы не точку искать, а область предполагаемого входа, при прочих равных рисках. Пусть мы не доберём прибыль, но и не потеряем больше запланированного убытка.
 

Кажется понял.

При таком условии получалось уравнение с 3 неизвестными.
Пусть расстояние от точки построения до уровня 61,8 = 16п, 50 = 22п, 38 = 27п.
Получается такое уравнение:

16x1 + 22x2 + 27x3 = 16

Судя по всему нужно задавать вручную (extern) значения x3, x2 и высчитывать x1 исходя из общего уровня риска.

 

Криво, на костылях, но поставленную задачу вроде решает. (Может кому понадобится. В код базе не нашел.)

//+------------------------------------------------------------------+
//|                                                     SCR_Fibo.mq4 |
//|                      Copyright © 2012, MetaQuotes Software Corp. |
//|                                              http://www.mql4.ru/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, MetaQuotes Software Corp."
#property link      "http://www.mql4.ru/"
#property show_inputs
#include <stdlib.mqh>

extern double Base_Lot       = 0.1;   // базовый объем (совокупная позиция);
extern double Lot_0.38       = 0.01;  // лот ордера уровня 0,38 
extern double Lot_0.5        = 0.05;  // лот ордера уровня 0,5 
extern bool   UseStopOrders  = false; // разрешать (True) или запрещать (False) установку ордеров BuyStop и SellStop;
extern bool   UseLimitOrders = true;  // разрешать (True) или запрещать (False) установку ордеров BuyLimit и SellLimit;
extern int    MagicNumber    = 22032012;   

// глобальные переменные
int           CountLevels;
bool          Direction;
double        OpenPrice[10];
double        StopLevel;
double        Spread;
double        Tick;
double        Price;
double        SL;
double        TP;
bool          rez;
int           Type;
double        StopLoss;

double        Lot_0.61;
double        SL_0.38;
double        SL_0.5;
double        SL_0.61;

bool          MarketEx      = True;                // Рыночное исполнение
bool          gbDisabled    = False;               // Блокировка
bool          UseSound      = TRUE;
string        NameFileSound = "expert.wav";
color         clOpenBuy     = Blue;
color         clOpenSell    = Red;
color         clModifyBuy   = Aqua;
color         clModifySell  = Tomato;
color         clCloseBuy    = Yellow;
color         clCloseSell   = Green;
int           NumberOfTry   = 15;
int           Slippage      = 3;               // Проскальзывание цены
string        SoundSuccess  = "ok.wav";        // Звук успеха
string        SoundError    = "timeout.wav";   // Звук ошибки
string        lotsinfo; 
int           modeSetOrders = 1;      // Способ установки ордеров:
                                      //  0 - по заданной цене
                                       //  1 - скорректировать цены
                                       //  2 - вход по текущим ценам
                                       

//+----------------------------------------------------------------------------+
//|  script program start function                                             |
//+----------------------------------------------------------------------------+
int start()
{
//----
  FindFibo();
  
  if(rez==true)
  {
    //for(int i = 0; i < CountLevels; i++)
    for(int i = 2; i < 5; i++)
    {
      // – 2 – == Расчет для BUY-ордеров =================================
      Type = -1;                           // по умолчанию ордеров не устанавливаем
      if(Direction==true)
      {
        RefreshRates();
        if(OpenPrice[i] > Ask)
        {   // если цена выше Ask, то ставим BuyStop
          if(UseStopOrders)
          {
            Type = OP_BUYSTOP;
            Price = OpenPrice[i];
          }
        }  
        if(OpenPrice[i] < Ask)  // если цена ниже Ask, то ставим BuyLimit
        {  
          if(UseLimitOrders)
          {
            Type = OP_BUYLIMIT;
            Price = OpenPrice[i];
          }
        }  
      }
      // – 2 – == Окончание блока =====================================
      // – 3 – == Расчет для SELL-ордеров ================================
      if(Direction==false)
      {
        RefreshRates();
        if(OpenPrice[i] < Bid)// если цена ниже Bid, то ставим SellStop
        {  
          if(UseStopOrders)
          {
            Type = OP_SELLSTOP;
            Price = OpenPrice[i];
          }
        }  
        if(OpenPrice[i] > Bid) // если цена выше Bid, то ставим SellLimit
        {
          if(UseLimitOrders)
          {
            Type = OP_SELLLIMIT;
            Price = OpenPrice[i];
          }
        }
      }
      // – 3 – == Окончание блока =====================================
      // – 4 – == Установка одного ордера ================================
      if(Type != -1) // если ордер определен, то устанавливаем
      {        
        if(NumberOfOrders(NULL, -1, MagicNumber) <=2 )
        {
          if(Price==OpenPrice[2])
          {
            SetOrder(NULL, Type, Lot_0.38, Price, StopLoss, 0, MagicNumber, "", 0);
          } 
          if(Price==OpenPrice[3])
          {
            SetOrder(NULL, Type, Lot_0.5, Price, StopLoss, 0, MagicNumber, "", 0);
          } 
          if(Price==OpenPrice[4])
          {
            Lot_0.61=NormalizeDouble( (Base_Lot*SL_0.61-Lot_0.38*SL_0.38-Lot_0.5*SL_0.5)/SL_0.61, 2);
            SetOrder(NULL, Type, Lot_0.61, Price, StopLoss, 0, MagicNumber, "", 0);
          } 
        }  
      }  
      // – 4 – == Окончание блока =====================================
    }
  }   
//----
  return(0);
}
//+------------------------------------------------------------------+
//Сначала скрипт должен найти инструмент «линии Фибоначчи»:
void FindFibo()
{
  if (ObjectsTotal(OBJ_FIBO) > 0)
  {
    // – 1 – ========== Нахождение первой по счету сетки Фибо ==============
    for(int i = ObjectsTotal()-1; i >= 0; i--)
    {
      if(ObjectType(ObjectName(i)) == OBJ_FIBO)
      {
        break;
      }
    }    
    // – 1 – ========== Окончание блока =============================
    // – 2 – ========== Определение цены каждого из уровней ===============
    string Name = ObjectName(i);
    double ZeroLevel = ObjectGet(Name, OBJPROP_PRICE2);
    double Level100 = ObjectGet(Name, OBJPROP_PRICE1);
    CountLevels = ObjectGet(Name, OBJPROP_FIBOLEVELS);
    
    
    if(ZeroLevel > Level100)
    {
      Direction = True;
    }  
    else
    {
      Direction = false;
    }  
    
    
    for (i = 0; i < CountLevels; i++)
    {
      double Level = ObjectGet(Name, OBJPROP_FIRSTLEVEL+i);
      if (!Direction)
      {
        if(Level==1)
        {
          StopLoss = ND(ZeroLevel - (ZeroLevel - Level100)*Level);
        }
      }
      else
      {
        if(Level==1)
        {
          StopLoss = ND(ZeroLevel + (Level100 - ZeroLevel)*Level);
        }
      }
    }
    
    for (i = 0; i < CountLevels; i++)
    {
      Level = ObjectGet(Name, OBJPROP_FIRSTLEVEL+i);
      if (!Direction)
      {
        if(Level!=0 && Level!=0.236 && Level!=1 && Level!=1.618 && Level!=2.618 && Level!=4.236)
        {
          OpenPrice[i] = ND(ZeroLevel - (ZeroLevel - Level100)*Level);
          if(Level==0.382)
          {
            SL_0.38=MathAbs( (StopLoss-OpenPrice[i])*Point );
          }
          if(Level==0.5)
          {
            SL_0.5=MathAbs( (StopLoss-OpenPrice[i])*Point );
          }
          if(Level==0.618)
          {
            SL_0.61=MathAbs( (StopLoss-OpenPrice[i])*Point );
          }
        }  
      }  
      else
      {
        if(Level!=0 && Level!=0.236 && Level!=1 && Level!=1.618 && Level!=2.618 && Level!=4.236)
        {
          OpenPrice[i] = ND(ZeroLevel + (Level100 - ZeroLevel)*Level);
          if(Level==0.382)
          {
            SL_0.38=MathAbs( (StopLoss-OpenPrice[i])*Point );
          }
          if(Level==0.5)
          {
            SL_0.5=MathAbs( (StopLoss-OpenPrice[i])*Point );
          }
          if(Level==0.618)
          {
            SL_0.61=MathAbs( (StopLoss-OpenPrice[i])*Point );
          }
        }  
      }  
    }
    rez = true;
    // – 2 – ========== Окончание блока =============================
  }
  else
  {
    Alert("Ни одна Фибо сетка не найдена!");
    rez = false;
    //return(False);
  }
}
Файлы:
scr_fibo.mq4  19 kb
 
sv.:

Криво, на костылях, но поставленную задачу вроде решает. (Может кому понадобится. В код базе не нашел.)



Забыл добавить. Сначало строится фиба, а потом на график бросается скрипт.
 
sv.:

1) Строится фибо.

2) Пусть, гипотетически, мы можем выставить только один лимитный ордер на уровне 61,8 с размером лота 0,1(задаётся) и SL=MathAbs(начальная точка построения фибо - уровень 61,8).

3) Разбиваем этот один лот(0,1) на 3 части(x1, x2, x3) и разносим лимитные ордера по уровням: 38.2 - x1, 50.0 - x2, 61.8 - x3

4) Как расчитать размеры x1, x2, x3, если максимальный совокупный убыток (одщий SL этих трёх позиций) равен максимальному убытку гипотетической позиции с п.2

Не подскажите, может что-то подобное есть в открытом доступе, или как пощитать эти x1, x2, x3.

надо решать систему уравнений как - то типа:

1) "цена 38.2" * x1 + "цена 50" * x2 + "цена 61.8" * x3 = "цена 61.8" * (x1 + x2 + x3)

2) x1 + x2 + x3 = 0.1

как известно, если 3 неизвестных, то нужно как минимум 3 различных выражения (уравнения). иначе неизвестные не выразить

придется искуственно ввести соотношение между 2 из 3 имеющихся неизвестных объемов (любых на Ваше усмотрение). это искусственно введенное соотношение можно будет потом оптимизировать

 
smshev:

надо решать систему уравнений как - то типа:

1) "цена 38.2" * x1 + "цена 50" * x2 + "цена 61.8" * x3 = "цена 61.8" * (x1 + x2 + x3)

2) x1 + x2 + x3 = 0.1

как известно, если 3 неизвестных, то нужно как минимум 3 различных выражения (уравнения). иначе неизвестные не выразить

придется искуственно ввести соотношение между 2 из 3 имеющихся неизвестных объемов (любых на Ваше усмотрение). это искусственно введенное соотношение можно будет потом оптимизировать



т.е. это чисто оптимизационная задача и значения x1, x2, x3 могут принимать значения от MinLot, до BaseLot?
Т.е. к примеру x1 принять значение 98% от BaseLot, а x2 и x3 по 1-2%. (Одно из множества решений)

Думаю разумнее вручную задавать эти неизвестные (x1, x2), хотя интересно было бы задать ориентировочное процентное соотношение между x1, x2, x3. (x1<x2<x3).
 
 



Спасибо. Интересная работа.

Насколько я понял, это инструмент для наращивания объёма позиции.

Здесь стояла задача поймать коррекцию.