Не подскажите, может что-то подобное есть в открытом доступе, или как пощитать эти x1, x2, x3.
Предположительно должно быть что-то типа этого:
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); } }
Криво, на костылях, но поставленную задачу вроде решает. (Может кому понадобится. В код базе не нашел.)
Забыл добавить. Сначало строится фиба, а потом на график бросается скрипт.
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 имеющихся неизвестных объемов (любых на Ваше усмотрение). это искусственно введенное соотношение можно будет потом оптимизировать
надо решать систему уравнений как - то типа:
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).
Спасибо. Интересная работа.
Насколько я понял, это инструмент для наращивания объёма позиции.
Здесь стояла задача поймать коррекцию.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
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.