Андрей, добрый день.С Днем Победы!
Наверное имеется ввиду следущее:
лот = указанная сумма/|(бид-ближайший фрактал)|;
или
лот = указанная сумма/|(бид-(хай1 или лоу1 по ситуации))|;
Балдею я от сибиряков. Все время стремятся чем либо померятся.
Если вы все время говорите о возможности хода цены не туда куда надо, то как вы планируете зарабатывать?
И еще, мне кажется, что вы не до конца поняли стратегию защиты ценового канала. Хотя, может вы трудитесь над другой стратегией. До конца не понял.
НО ТУТ УЖ САМОМУ РЕШАТЬ ЧТО ВАЖНЕЕ. ДЕПОЗИТ СОХРАНЯТЬ ИЛИ БАБЛО РУБИТЬ.
И еще, Вы не пробовали тралить просто какую-то цену? Не цену SL ордера, а, например, цену БУ группы ордеров. В чем разница?
Попробуйте. Много интересного.
А на счет другого алгоритма расчета лотов все просто.
И еще, если начнет прижимать просадка по свободным бабулям, посмотрите у меня на блоге еще один вариант расчета ордеров.
//-------------------------------------------------------------------
extern string s_1 = " Закрывать дальнюю убыточную и положительные при достижении суммарного профита CloseProfit";
extern bool Close_1 = false;
enum tt
{
tr2=0, //по текущей валюте
tr1=1, //по всем символам
};
extern double CloseProfit = 10; // Закрывать по суммарному профиту в валюте;
input tt Symbоl = 1; // Суммируем профит
extern string s_2 = " Закрывать и удалять всё при достижении суммарного профита Profits или Loss";
extern bool Close_2 = false;
extern double Loss = 2000; // Loss убыток в валюте если 0 то не используется
extern double Profits = 0; // Profits профит в валюте 0 то не используется
extern string s_3 = " Закрывать 2 позиции с максимальным лотами при достижении суммарного профита profits или Los";
extern bool Close_3 = false;
extern double loss = 2000; // loss убыток в валюте если 0 то не используется
extern double profits = 0; // profits профит в валюте 0 то не используется
extern string s_4 = " Закрывать и удалять всё при открытии более чем N позиций и достижении суммарного профита рrof ";
extern bool Close_4 = false;
extern double prof = 10; // profits профит в валюте 0 то не используется
extern int N = 3; // Максимальное кол-во открытых позиций
extern string s_5 = " Закрывать нескольско последних позиций при открытии более чем Partpos позиций и достижении по ним суммарного профита Prof ";
extern bool Close_5 = false;
extern int Partpos = 3; // число поз после которого происходит для закрытия части позиций
extern double Prof = 10; // Prof профит части позиций в валюте для их последующего закрытия
extern double Lot = 0.01; // Стартовый лот
extern bool easy = true; // Использовать легкий вариант рассчета последующих лотов
extern int delta = 150; // Расстояние до стоп ордера от крайней позиции
extern bool Tral = false; // Использовать трал средств
extern int EqvTralStep= 80; // Шаг трала по Эквити счета в валюте депозита
extern int Slip = 30; // Проскальзывание
extern int Magic = 123; // Магик
Хотелось бы советника кинуть на торгуемые инструменты и забыть, зная что при открытии ордера и выставлении стопа он отработает сейф. Не заморачиваться с магиками и какую часть закрывать.
Eurusd-Gbpusd.В это связки всегда будет положительная корреляция.
extern string a4 = "входные параметры индикатора корреляции";
extern ENUM_TIMEFRAMES Tf = PERIOD_H1; // таймфрейм
extern int Correl_Period = 14;
extern double MinCor = 0.50;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double Correl(string base,string hedge,int shift)
{
shift=0;
double u1=0,l1=0,s_1=0;
int base_bn=iBarShift(base,0,Time[shift],false);
int hedge_bn=iBarShift(hedge,0,Time[shift],false);
for(int i = Correl_Period - 1; i >= 0; i--){
u1 +=(iClose(base,Tf,base_bn+i)-iMA(base,Tf,Correl_Period,0,MODE_SMA,PRICE_CLOSE,base_bn+i))*
(iClose(hedge,Tf,hedge_bn+i)-iMA(hedge,Tf,Correl_Period,0,MODE_SMA,PRICE_CLOSE,hedge_bn+i));
l1 += MathPow(iClose(base,Tf,base_bn+i)-iMA(base,Tf,Correl_Period,0,MODE_SMA,PRICE_CLOSE,base_bn+i),2);
s_1 += MathPow(iClose(hedge,Tf,hedge_bn+i)-iMA(hedge,Tf,Correl_Period,0,MODE_SMA,PRICE_CLOSE,hedge_bn+i),2);
}
double dMathSqrt = MathSqrt(l1*s_1);
if(dMathSqrt > 0)
return(u1 / dMathSqrt);
return(0);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Закрытие части позиции по условию взятии части профита.mq4 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| http://www.mункцql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "http://www.mункцql5.com"
#property version "1.00"
#property strict
#define OP_FLAT -1
#define TRADE_RETRY_COUNT 4 // номер определяет, сколько раз EA пытается отправить заказ.
#define TRADE_RETRY_WAIT 100 //Интервал сна в миллисекундах. 100 миллисекунд равны 0,1 секунды.
input double Lots = 0.02; // Лот
input int Slip = 10; // Проскальзование
static input int Magic = 1111; // Magic
static input string ClosePart = " - = Настройка частичного закрытия ордеров = -";
input int PartTakeProfit = 300; // Тейк частичного закрытия в пунктах
input double PartCloseLots = 0.01; // Сколько закрывать
double posType = OP_FLAT;
int posTicket = 0;
double posLots = 0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
CloseOrderPart();
}
//+------------------------------------------------------------------+
//| Проверка на условие закрытия PartTakeProfit и само закрытие поз |
//+------------------------------------------------------------------+
void CloseOrderPart(){
int cnt = OrdersTotal();
for(int i=0; i<cnt; i++)
{
if(!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
if(OrderSymbol() != Symbol()) continue;
if(OrderMagicNumber()!=Magic) continue;
if(OrderType() == OP_BUY){
if(Bid-OrderOpenPrice() > PartTakeProfit*Point)
{
ClosePosition();
}
}
if(OrderType() == OP_SELL)
{
if(OrderOpenPrice()-Ask > PartTakeProfit*Point)
{
ClosePosition();
}
}
}
}
//+------------------------------------------------------------------+
//| Функция частичного закрытия позиций размером PartCloseLots |
//+------------------------------------------------------------------+
void ClosePosition(){
for(int attempt=0; attempt<TRADE_RETRY_COUNT; attempt++){
bool closed;
int lastError=0;
if(posLots==Lots)
{
double price=MarketInfo(Symbol(),posType==OP_BUY ? MODE_BID : MODE_ASK);
closed=OrderClose(posTicket,PartCloseLots,price,Slip,clrYellow);
lastError=GetLastError();
}
if(closed) // Позиция закрыта
break; // Выходим из цикла
if(lastError==4108) // Не верный номер тикета
break; // Выходим из цикла
Sleep(TRADE_RETRY_WAIT);
Print("Close Position retry no: "+IntegerToString(attempt+2)); //
}
}
//+------------------------------------------------------------------+
Наверное надо сравнить разницу между (бид — нижний фрактал) и (верхний фрактал — бид), а в расчете использовать большую разницу.Тогда величина лота все таки будет меньше чем сейчас, во всяком случае не больше, значит и залог нужен будет меньше.
И ещё, может быть есть смысл перенести код индикатора в код советника.
Если нужно могу оформить как заказ.
ssg