Андрей, добрый день.С Днем Победы!
Наверное имеется ввиду следущее:
лот = указанная сумма/|(бид-ближайший фрактал)|;
или
лот = указанная сумма/|(бид-(хай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)); //
}
}
//+------------------------------------------------------------------+
<code>//+------------------------------------------------------------------+ //| Fractals.mq5 | //| Copyright 2009, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "2009, MetaQuotes Software Corp." #property link "http://www.mql5.com" //---- indicator settings #property indicator_chart_window #property indicator_buffers 2 #property indicator_plots 2 #property indicator_type1 DRAW_ARROW #property indicator_type2 DRAW_ARROW #property indicator_color1 Gray #property indicator_color2 Gray #property indicator_label1 "Fractal Up" #property indicator_label2 "Fractal Down" //---- indicator buffers double ExtUpperBuffer[]; double ExtLowerBuffer[]; //--- 10 pixels upper from high price int ExtArrowShift=-10; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void OnInit() { //---- indicator buffers mapping SetIndexBuffer(0,ExtUpperBuffer,INDICATOR_DATA); SetIndexBuffer(1,ExtLowerBuffer,INDICATOR_DATA); IndicatorSetInteger(INDICATOR_DIGITS,_Digits); //---- sets first bar from what index will be drawn PlotIndexSetInteger(0,PLOT_ARROW,217); PlotIndexSetInteger(1,PLOT_ARROW,218); //---- arrow shifts when drawing PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,ExtArrowShift); PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,-ExtArrowShift); //---- sets drawing line empty value-- PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE); PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE); //---- initialization done } //+------------------------------------------------------------------+ //| Accelerator/Decelerator Oscillator | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total,const int prev_calculated, const datetime &Time[], const double &Open[], const double &High[], const double &Low[], const double &Close[], const long &TickVolume[], const long &Volume[], const int &Spread[]) { int i,limit; //--- if(rates_total<5) return(0); //--- if(prev_calculated<7) { limit=2; //--- clean up arrays ArrayInitialize(ExtUpperBuffer,EMPTY_VALUE); ArrayInitialize(ExtLowerBuffer,EMPTY_VALUE); } else limit=rates_total-5; for(i=limit;i<rates_total-3 && !IsStopped();i++) { //---- Upper Fractal if(High[i]>High[i+1] && High[i]>High[i+2] && High[i]>=High[i-1] && High[i]>=High[i-2]) ExtUpperBuffer[i]=High[i]; else ExtUpperBuffer[i]=EMPTY_VALUE; //---- Lower Fractal if(Low[i]<Low[i+1] && Low[i]<Low[i+2] && Low[i]<=Low[i-1] && Low[i]<=Low[i-2]) ExtLowerBuffer[i]=Low[i]; else ExtLowerBuffer[i]=EMPTY_VALUE; } //--- OnCalculate done. Return new prev_calculated. return(rates_total); } //+------------------------------------------------------------------+</code>Наверное надо сравнить разницу между (бид — нижний фрактал) и (верхний фрактал — бид), а в расчете использовать большую разницу.Тогда величина лота все таки будет меньше чем сейчас, во всяком случае не больше, значит и залог нужен будет меньше.
И ещё, может быть есть смысл перенести код индикатора в код советника.
Если нужно могу оформить как заказ.
ssg