fibotrader lite mt4.mq4
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «fibotrader lite mt4.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
FiboTrader Lite — торговый советник для MetaTrader 4, работающий на основе анализа фибоначчиевых уровней. Советник строит фибо сетку на графике, анализирует ценовые импульсы и управляет торговыми позициями с различными режимами стоп-лосса, тейк-профита и безубытка. Поддерживается фильтрация сигналов по скользящим средним и параболику, а также частичное закрытие позиций и трейлинг по средствам.
Настройки программы
| Настройка | Описание |
|---|---|
| Debug mode (Debug) | Отладка — Включает режим отладки для вывода дополнительной информации в журнал. |
| Time work (WorkTime) | Время работы — Задаёт временной диапазон, в течение которого советник активен (формат ЧЧ:ММ-ЧЧ:ММ). |
| Comment (cmt) | Комментарий — Текстовый комментарий, добавляемый к ордерам советника. |
| Draw orders (DrawOrders) | Отрисовка ордеров — Включает визуальное отображение линий ордеров на графике (только для MT4). |
| Magic | Магический номер — Идентификатор ордеров советника для их уникальной маркировки. |
| TF (tf) | Таймфрейм — Таймфрейм, на котором советник анализирует ценовые данные и строит фибо сетку. |
| Manual first fibo (ManualFirstFibo) | Ручная фибо сетка — Позволяет вручную задать начальную фибо сетку на графике вместо автоматического построения. |
| Draw new fibo (NewFibo) | Новая фибо сетка — Включает автоматическое построение новой фибо сетки при отсутствующей на графике. |
| Add new orders (pyramiding) (AddNew) | Добавление ордеров — Разрешает открытие дополнительных ордеров (пиррамидинг) по направлению текущей позиции. |
| Ignore risk for new orders (IgnoreRisk) | Игнорировать риск — Отключает проверку риска при открытии новых ордеров. |
| Max orders (MaxOrders) | Максимум ордеров — Максимальное количество ордеров, разрешённых для одного направления. |
| Swing trading (close by inverse signal) (SwingTrading) | Свинг-торговля — При активации закрывает позицию при появлении обратного сигнала на фибо уровне. |
| Flat Minimal Bars (FlatMinimalBars) | Минимум баров плоскости — Минимальное количество баров коррекции, при котором направление считается плоским. |
| Reverse signal sensitivity % (ReverseSensitivity) | Чувствительность разворота — Процентная чувствительность определения разворотного сигнала на фибо уровне. |
| Impulse minimal at points (0 - off) (ImpulseSizeMin) | Минимум импульса — Минимальный размер ценового импульса в пунктах для обработки сигнала (0 — выключено). |
| Impulse maximum at points (0 - off) (ImpulseSizeMax) | Максимум импульса — Максимальный размер ценового импульса в пунктах для обработки сигнала (0 — без ограничения). |
| Draw fibo (DrawFibo) | Отрисовка фибо — Включает отображение фибо сетки и уровней на графике. |
| Risk mode (Risk) | Режим риска — Режим управления риском: в валюте счёта, в процентах или фиксированный лот. |
| Risk in valute (RiskValute) | Риск в валюте — Размер допустимого риска в валюте счёта на одну сделку. |
| Risk in % (RiskProcent) | Риск в процентах — Размер допустимого риска в процентах от баланса на одну сделку. |
| Fix lot (Lot) | Фиксированный лот — Фиксированный размер лота для открытия ордеров. |
| Max risk by chart % (0 - off) (MaxRiskByChart) | Макс. риск по графику — Максимальный допустимый риск по текущему графику в процентах (0 — выключено). |
| Maximum stop (count) (MaxStop) | Максимум стопов — Максимальное количество стоп-лоссов, разрешённых для направления. |
| Maximum positions on the account (MaxPositions) | Макс. позиции — Максимальное количество одновременных позиций на счёте (0 — без ограничения). |
| Minimum margin on the account (%) (MinimalMargin) | Минимальная маржа — Минимальный уровень свободной маржи в процентах, при котором советник прекращает торговлю. |
| Open Level1 (OpenLevel1) | Уровень входа — Фибо-уровень (в процентах от импульса), на котором выполняется вход в сделку. |
| TP1 (Safe) mode (TP1) | Режим тейк-профита — Режим фиксации прибыли: отключён или по касанию уровня. |
| No close if the position in BU (NoCloseBU) | Не закрывать в БУ — Запрещает закрытие позиции, если она уже переведена в безубыток. |
| Part close % (TP1_ProcentClose) | Процент частичного закрытия — Процент объёма позиции, закрываемый при достижении тейк-профита. |
| Take Level % (TP1_Level) | Уровень тейк-профита — Фибо-уровень (в процентах от импульса) для частичной фиксации прибыли. |
| SL mode (SL) | Режим стоп-лосса — Режим расчёта стоп-лосса: по касанию уровня или по пробою. |
| SL Level % (SL_Level) | Уровень стоп-лосса — Процент от размера импульса для расчёта уровня стоп-лосса. |
| SL Offset in points (SL_Offset) | Смещение стоп-лосса — Дополнительное смещение стоп-лосса в пунктах от расчётного уровня. |
| Close signal sensitivity % (CloseSensitivity) | Чувствительность закрытия — Процентная чувствительность при закрытии позиции по пробою стопа. |
| BU mode (BU) | Режим безубытка — Режим перевода позиции в безубыток: отключён или по достижении уровня. |
| BU Level % (BU_Level) | Уровень безубытка — Фибо-уровень (в процентах от импульса), при достижении которого позиция переводится в БУ. |
| Min profit in points (BU_MinProfit) | Мин. прибыль для БУ — Минимальная прибыль в пунктах, необходимая для активации перевода в безубыток. |
| Trailing equity start % (TrailingEquity) | Трейлинг по средствам — Процент прибыли, с которого начинается трейлинг стоп-лосса по средствам. |
| Trailing equity step % (TrailingEquityStep) | Шаг трейлинга — Процентный шаг сдвига трейлинг-стопа по средствам. |
| Close by profit % (0-off) (CloseByProfit) | Закрытие по прибыли — Процент прибыли от баланса, при достижении которого все позиции закрываются (0 — выключено). |
| Filter mode (Filter) | Режим фильтра — Режим фильтрации торговых сигналов: выключен, MA+SAR или по импульсу. |
| Filter TF (FilterTF) | Таймфрейм фильтра — Таймфрейм, на котором рассчитываются индикаторы фильтра. |
| MA_Fast | Быстрая MA — Период быстрой экспоненциальной скользящей средней для фильтра. |
| MA_Slow | Медленная MA — Период медленной экспоненциальной скользящей средней для фильтра. |
| SAR_Step | Шаг SAR — Шаг параболического индикатора SAR. |
| SAR_Maximum | Максимум SAR — Максимальное значение шага параболического индикатора SAR. |
Поиск по коду файла
#property version "1.22"
#property description "telegram: @trade_moex"
#property strict
#property icon "\\Images\\fibotraderlite.ico";
/*
1.22 - добавлено удаление фибо советника при перезапуске, убран режим Use leverage, теперь он автоматически определяет.
1.19 - оптимизация поиска паттерна
1.17 - добавлена опция выключения плеча и исправление частичного закрытия
1.16 - исправлен порядок закрытие по тр и перенос в бу, при определенных настройках вначале переносило в бу, а затем првоеряло можн
1.15 - исправление логики поиска уровней
1.14 - исправлено отображение линии бу от другого инструмента и округление лота на акциях
*/
#define LICENSE_OFF
#define LICENSE_DEMO
#define TRIAL_DAYS 30
#define LICENSE_NAME "$zq2fl{t}{n~~~@mf5j#y|~b@aanx66x"
#define LICENSE_FILE "ftl"
#define VALID_KEY "Expert active. "
#define EMPTY_KEY "You must activate the adviser."
#define INVALID_KEY "Invalid license."
#define EXPERIED "License expired."
bool bcheck=false;
#define POINTS_NEW
#include <sovetnikovNET\Orders.mqh>
#include <sovetnikovNET\Time.mqh>
#include <sovetnikovNET\Draw.mqh>
#include <sovetnikovNET\Bcrypt.mqh>
enum enum_take
{
TAKE_OFF, //Off
TAKE_LEVEL, //Take level %
};
enum enum_stop
{
STOP_LEVEL, //Touch level and tral
STOP_BREAK, //Breakout level and tral
};
enum enum_bu
{
BU_OFF, //Off
BU_LEVEL, //BU Level %
};
enum enum_filter
{
FILTER_OFF, //Off
FILTER_MASAR, //MA+SAR
FILTER_IMPULSE,//Main impulse
};
enum enum_mm
{
RISK_VALUTE, //Risk in valute
RISK_PROCENT,//Risk in %
RISK_FIX,//Fix lot
};
GROUP("Main settings");//.
B Debug=true; //Debug mode
TRADEMODE TradeMode=TRADEMODE_LONG;
S WorkTime="00:00-24:00"; //Time work
S cmt=""; //Comment
#ifndef __MQL5__
B DrawOrders=true; //Draw orders
#endif
I Magic=20200221;
TF tf=PERIOD_D1; //TF
GROUP("Fibo config");//.
B ManualFirstFibo=false; //Manual first fibo
B NewFibo=true; //Draw new fibo
B AddNew=true; //Add new orders (pyramiding)
B IgnoreRisk=false; //Ignore risk for new orders
I MaxOrders=1; //Max orders
B SwingTrading=false; //Swing trading (close by inverse signal)
I FlatMinimalBars=1; //Flat Minimal Bars
D ReverseSensitivity=5; //Reverse signal sensitivity %
D ImpulseSizeMin=0; //Impulse minimal at points (0 - off)
D ImpulseSizeMax=0; //Impulse maximum at points (0 - off)
B DrawFibo=true; //Draw fibo
C ColorFibo=clrSandyBrown;//Color fibo
C ColorFiboLevels=clrRed;//Color fibo levels
C ColorLineTP=clrGreen;// Color line TP
STYLE StyleLineTP=STYLE_DASH; //Style line TP
C ColorLineBU=clrDarkTurquoise;//Color line BU
STYLE StyleLineBU=STYLE_DASH;//Style line BU
GROUP("MM settings");//.
input enum_mm Risk=RISK_PROCENT; //Risk mode
D RiskValute=0; //Risk in valute
D RiskProcent=5; //Risk in %
D Lot=1; //Fix lot
D MaxRiskByChart=10; //Max risk by chart % (0 - off)
I MaxStop=1; //Maximum stop (count)
D MaxPositions=4; //Maximum positions on the account
D MinimalMargin=10; //Minimum margin on the account (%)
GROUP("Open settings");//.
D OpenLevel1=38.2; //Open Level1
GROUP("Take profit and Part close settings");//.
input enum_take TP1=TAKE_LEVEL; //TP1 (Safe) mode
B NoCloseBU=true; //No close if the position in BU
D TP1_ProcentClose=50; //Part close %
D TP1_Level=-50; //Take Level %
GROUP("Stop loss settings");//.
input enum_stop SL=STOP_BREAK; //SL mode
D SL_Level=100; //SL Level %
D SL_Offset=0; //SL Offset in points
D CloseSensitivity=30; //Close signal sensitivity %
GROUP("Breakeven settings");//.
input enum_bu BU=BU_LEVEL; //BU mode
D BU_Level=-50; //BU Level %
D BU_MinProfit=1; //Min profit in points
GROUP("Trailing settings");//.
D TrailingEquity=10; //Trailing equity start %
D TrailingEquityStep=5; //Trailing equity step %
D CloseByProfit=20; //Close by profit % (0-off)
GROUP("Filter settings");//.
input enum_filter Filter=FILTER_MASAR; //Filter mode
TF FilterTF=PERIOD_D1; //Filter TF
I MA_Fast=20;
I MA_Slow=200;
D SAR_Step=0.002;
D SAR_Maximum=0.02;
CGlobal m_global;
int slippage=0;
class CMyOrders: public COrders
{
public:
double ma_fast;
double ma_slow;
double sar;
double dtickPrice,dMaxDD;
double dProfit;//+=m_position.Profit()+m_position.Swap()+m_position.Commission();
#ifdef __MQL5__
int hma_fast,hma_slow,hsar;
virtual bool OnInitIndicators()
{
hma_fast=iMA(_Symbol,FilterTF,MA_Fast,0,MODE_EMA,PRICE_CLOSE);
hma_slow=iMA(_Symbol,FilterTF,MA_Slow,0,MODE_EMA,PRICE_CLOSE);
hsar=iSAR(_Symbol,FilterTF,SAR_Step,SAR_Maximum);
if(hma_fast==INVALID_HANDLE || hma_slow==INVALID_HANDLE || hsar==INVALID_HANDLE)
{
PrintFormat("Critical error. Invalid create indicators. %d",GetLastError());
return false;
}
return true;
}
virtual bool OnDeInitIndicators()
{
IndicatorRelease(hsar);
IndicatorRelease(hma_fast);
IndicatorRelease(hma_slow);
return true;
}
#endif
virtual void OnInit(string n,int iimagic,int iislippage)
{
// код доступен только после оплаты
}
virtual void Position()
{
dProfit+=m_position.Profit()+m_position.Swap()+m_position.Commission()*2;
double dopen=OrderOpenPrice();
double dstop=OrderStopLoss();
double dlot=OrderLots();
ENUM_ORDER_TYPE itype=(ENUM_ORDER_TYPE)OrderType();
if(SL==STOP_BREAK || SL==STOP_LEVEL)
{
if(itype==OP_BUY)
{
double dlevel0=m_global.LoadParam("long0",0);
double dlevel100=m_global.LoadParam("long100",0);
if(dlevel0>0 && dlevel100>0)
{
double dsizeImpulse=ND1(Abs((dlevel0-dlevel100)/p));
dstop=nd(dlevel0-p*dsizeImpulse*SL_Level/100-SL_Offset*p);
}
}
else
if(itype==OP_SELL)
{
double dlevel0=m_global.LoadParam("short0",0);//оптимизировать лоадпарам
double dlevel100=m_global.LoadParam("short100",0);
if(dlevel0>0 && dlevel100>0)
{
double dsizeImpulse=ND1(Abs((dlevel0-dlevel100)/p));
dstop=nd(dlevel0+p*dsizeImpulse*SL_Level/100+SL_Offset*p);
}
}
}
if(dstop>0 && dopen>0)
{
if(itype==OP_BUY && dstop>=dopen)
return;
if(itype==OP_SELL && dstop<=dopen)
return;
double dSummLot=0,dprofit=0;
int ipart=get_part(m_position.Ticket(),dSummLot,dprofit);//подсчитаем сколкьо принесли частичное закрытие и вычтем из общего убытка
double dSL=0;
if(itype==OP_BUY && dstop<dopen)
{
dSL=ND1((dstop-dopen)/p);
}
if(itype==OP_SELL && dstop>dopen)
{
dSL=ND1((dopen-dstop)/p);
}
dMaxDD+=NormalizeDouble(dtickPrice*dSL*dlot,2);
}
}
int filterMASAR(CNewBar &m_bar,ENUM_TIMEFRAMES etf,int ibar=0)
{
if(m_bar.isNewBar() || sar==0)
{
#ifdef __MQL5__
double buf[1];
if(CopyBuffer(hma_fast,0,ibar,1,buf)==1)
ma_fast=buf[0];
if(CopyBuffer(hma_slow,0,ibar,1,buf)==1)
ma_slow=buf[0];
if(CopyBuffer(hsar,0,ibar,1,buf)==1)
sar=buf[0];
#else
ma_fast=iMA(_Symbol,etf,MA_Fast,0,MODE_EMA,PRICE_CLOSE,ibar);
ma_slow=iMA(_Symbol,etf,MA_Slow,0,MODE_EMA,PRICE_CLOSE,ibar);
sar=iSAR(_Symbol,etf,SAR_Step,SAR_Maximum,ibar);
#endif
}
if(sar>0)
{
if(ma_fast>0 && ma_fast>ma_slow && sar<ma_fast && iClose(_Symbol,etf,1)>ma_fast && iClose(_Symbol,etf,1)>ma_slow)
return OP_BUY;
if(ma_fast>0 && ma_fast<ma_slow && sar>ma_fast && iClose(_Symbol,etf,1)<ma_fast && iClose(_Symbol,etf,1)<ma_slow)
return OP_SELL;
}
return -1;
}
double freeRisk()
{
return NormalizeDouble(dMaxDD*100/AccountBalance(),2); //вернем в % риск (число положительное)
}
void DrawLines(CDrawPos &m_pos)
{
if(IsDraw)
{
for(int i=m_global.GlobalVariablesTotal()-1; i>=0; i--)
{
string svar=m_global.GlobalVariableName(i);
datetime tm1=m_global.GlobalVariableTime(svar);
if(StringFind(svar,"_level_bu")>0)
{
string sret[];
if(string_explode("_",svar,sret)==3)
{
ulong iticket=(ulong)StringToInteger(sret[0]);
double dprice=m_global.GlobalVariableGet(svar);
#ifndef __MQL5__
if(::OrderSelect((int)iticket,SELECT_BY_TICKET))
{
string symbol=::OrderSymbol();
if(::OrderCloseTime()>0)
{
m_pos.Delete(0,svar);
m_global.GlobalVariableDel(svar);//подчистим от закрытых ордеров
}
else
{
if((::OrderType()==OP_BUY && ::OrderStopLoss()>=::OrderOpenPrice()) || (::OrderType()==OP_SELL && ::OrderStopLoss()>0 && ::OrderStopLoss()<=::OrderOpenPrice()))
{
m_pos.Delete(0,svar);
}
else
{
if(_Symbol==symbol)
m_pos.DrawHLine(0,svar,0,tm1,dprice,1,StyleLineBU,ColorLineBU,false,false,StringFormat("BU #%lld",iticket));
else
m_pos.Delete(0,svar);
}
}
}
#else
if(!::PositionSelectByTicket(iticket))
{
m_pos.Delete(0,svar);
m_global.GlobalVariableDel(svar);//подчистим от закрытых ордеров
}
else
{
string symbol=PositionGetString(POSITION_SYMBOL);
if((::PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY && ::PositionGetDouble(POSITION_SL)>=::PositionGetDouble(POSITION_PRICE_OPEN)) ||
(::PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL && ::PositionGetDouble(POSITION_SL)>0 && ::PositionGetDouble(POSITION_SL)<=::PositionGetDouble(POSITION_PRICE_OPEN)))
{
m_pos.Delete(0,svar);
}
else
{
if(_Symbol==symbol)
m_pos.DrawHLine(0,svar,0,tm1,dprice,1,StyleLineBU,ColorLineBU,false,false,StringFormat("BU #%lld",iticket));
else
m_pos.Delete(0,svar);
}
}
#endif
}
}
if(StringFind(svar,"_level_tp")>0)
{
string sret[];
if(string_explode("_",svar,sret)==3)
{
ulong iticket=(ulong)StringToInteger(sret[0]);
double dprice=m_global.GlobalVariableGet(svar);
#ifndef __MQL5__
if(::OrderSelect((int)iticket,SELECT_BY_TICKET))
{
string symbol=::OrderSymbol();
if(::OrderCloseTime()>0)
{
m_pos.Delete(0,svar);
m_global.GlobalVariableDel(svar);//подчистим от закрытых ордеров
}
else
{
if((::OrderType()==OP_BUY && ::OrderStopLoss()>=::OrderOpenPrice()) || (::OrderType()==OP_SELL && ::OrderStopLoss()>0 && ::OrderStopLoss()<=::OrderOpenPrice()))
{
m_pos.Delete(0,svar);
}
else
{
if(_Symbol==symbol)
m_pos.DrawHLine(0,svar,0,tm1,dprice,1,StyleLineTP,ColorLineTP,false,false,StringFormat("TP1 #%lld",iticket));
else
m_pos.Delete(0,svar);
}
}
}
#else
if(!::PositionSelectByTicket(iticket))
{
m_pos.Delete(0,svar);
m_global.GlobalVariableDel(svar);//подчистим от закрытых ордеров
}
else
{
string symbol=PositionGetString(POSITION_SYMBOL);
if((::PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY && ::PositionGetDouble(POSITION_SL)>=::PositionGetDouble(POSITION_PRICE_OPEN)) ||
(::PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL && ::PositionGetDouble(POSITION_SL)>0 && ::PositionGetDouble(POSITION_SL)<=::PositionGetDouble(POSITION_PRICE_OPEN)))
{
m_pos.Delete(0,svar);
}
else
{
if(_Symbol==symbol)
m_pos.DrawHLine(0,svar,0,tm1,dprice,1,StyleLineTP,ColorLineTP,false,false,StringFormat("TP1 #%lld",iticket));
else
m_pos.Delete(0,svar);
}
}
#endif
}
}
}
}
}
void checkOrders(bool bNewBar)
{
double dclose=iClose(_Symbol,tf,1);
double dopen=iOpen(_Symbol,tf,1);
bool bcontinue=false;
double dstopBuy=0,dstopSell=0;
int itotal=PositionsTotal();
for(int i=itotal-1; i>=0; i--)
{
if(SelectByIndex(i,true))
{
double dopenPrice=OrderOpenPrice();
double dstopPrice=OrderStopLoss();
double dstopFirst=dstopPrice;
double dlot=OrderLots();
ENUM_ORDER_TYPE itype=(ENUM_ORDER_TYPE)OrderType();
double dtakePrice=nd(m_global.GlobalVariableGet(StringFormat("%lld_level_tp",m_position.Ticket())));//получим тейк, который был рассчитан для ордера
if(dtakePrice>0)
{
bcontinue=false;
if(NoCloseBU)
{
if((itype==OP_BUY && dstopPrice>=dopenPrice) || (itype==OP_SELL && dstopPrice<=dopenPrice && dstopPrice>0))
bcontinue=true;
if(!bcontinue)
{
if(SL==STOP_LEVEL)
{
if(itype==OP_BUY)
{
double dlevel0=m_global.LoadParam("long0",0);
double dlevel100=m_global.LoadParam("long100",0);
if(dlevel0>0 && dlevel100>0 && dlevel0>dlevel100)
{
double dsizeImpulse=ND1(Abs((dlevel0-dlevel100)/p));
dstopPrice=nd(dlevel0-p*dsizeImpulse*SL_Level/100-SL_Offset*p);
}
}
else
if(itype==OP_SELL)
{
double dlevel0=m_global.LoadParam("short0",0);
double dlevel100=m_global.LoadParam("short100",0);
if(dlevel0>0 && dlevel100>0 && dlevel0<dlevel100)
{
double dsizeImpulse=ND1(Abs((dlevel0-dlevel100)/p));
dstopPrice=nd(dlevel0+p*dsizeImpulse*SL_Level/100+SL_Offset*p);
}
}
}
else
if(SL==STOP_BREAK)
{
if(itype==OP_BUY)
{
double dlevel0=m_global.LoadParam("long0",0);
double dlevel100=m_global.LoadParam("long100",0);
if(dlevel0>0 && dlevel100>0 && dlevel0>dlevel100)
{
double dsizeImpulse=ND1(Abs((dlevel0-dlevel100)/p));
dstopPrice=nd(dlevel0-p*dsizeImpulse*SL_Level/100-SL_Offset*p);
}
}
else
if(itype==OP_SELL)
{
double dlevel0=m_global.LoadParam("short0",0);
double dlevel100=m_global.LoadParam("short100",0);
if(dlevel0>0 && dlevel100>0 && dlevel0<dlevel100)
{
double dsizeImpulse=ND1(Abs((dlevel0-dlevel100)/p));
dstopPrice=nd(dlevel0+p*dsizeImpulse*SL_Level/100+SL_Offset*p);
}
}
}//if
}
if((itype==OP_BUY && dstopPrice>=dopenPrice) || (itype==OP_SELL && dstopPrice<=dopenPrice && dstopPrice>0))
bcontinue=true;
}
if(TP1==TAKE_LEVEL && !bcontinue)
{
if((itype==OP_BUY && _Bid>=dtakePrice) || (itype==OP_SELL && _Ask<=dtakePrice))
{
double dSummLot=0;
int ipart=get_part(m_position.Ticket(),dSummLot);
if(ipart==0)
{
if(OrderClose(m_position.Ticket(),NLot(dlot*TP1_ProcentClose/100))) //закроем часть ордера (защита стопа)
continue; //пропустим
}
}
}
}
if(BU==BU_LEVEL)
{
bcontinue=false;
double dpt=OrderProfitPoint();
if(dpt>=0)
{
if(dstopPrice>0 && (dstopPrice>dstopBuy || dstopBuy==0))
dstopBuy=dstopPrice;
if(dstopPrice>0 && (dstopPrice<dstopSell || dstopSell==0))
dstopSell=dstopPrice;
if(itype==OP_BUY && dstopPrice>0 && dstopPrice>=dopenPrice)
bcontinue=true;
if(itype==OP_SELL && dstopPrice>0 && dstopPrice<=dopenPrice)
bcontinue=true;
if(!bcontinue)
{
dtakePrice=nd(m_global.GlobalVariableGet(StringFormat("%lld_level_bu",m_position.Ticket())));//получим bu
if(dtakePrice>0)
{
double dprofit=m_position.Swap()+m_position.Commission()*2;
double dMinBU=ND1(dprofit/(dtickPrice*m_position.Volume()));
double dnewStop=nd(dopenPrice+(itype==OP_BUY?(BU_MinProfit+dMinBU):-(BU_MinProfit+dMinBU))*p);
if(itype==OP_BUY && _Bid>=dtakePrice && (dstopPrice==0 || dnewStop>dstopPrice) && dnewStop>=dopenPrice)
{
if(_Bid>dnewStop)
{
DEBUG("(%d) %lld bu: %.5f",__LINE__,m_position.Ticket(),dnewStop);
m_trade.PositionModify(m_position.Ticket(),dnewStop,0); //перенос в бу
if(dnewStop>0 && (dnewStop>dstopBuy || dstopBuy==0))
dstopBuy=dnewStop;
}
}
if(itype==OP_SELL && _Ask<=dtakePrice && (dstopPrice==0 || dnewStop<dstopPrice) && dnewStop<=dopenPrice)
{
if(_Ask<dnewStop)
{
DEBUG("(%d) %lld bu: %.5f",__LINE__,m_position.Ticket(),dnewStop);
m_trade.PositionModify(m_position.Ticket(),dnewStop,0); //перенос в бу
if(dnewStop>0 && (dnewStop<dstopSell || dstopSell==0))
dstopSell=dnewStop;
}
}
}
}
}
}
if(bNewBar)
{
if(SL==STOP_LEVEL)
{
if(itype==OP_BUY)
{
double dlevel0=m_global.LoadParam("long0",0);
double dlevel100=m_global.LoadParam("long100",0);
if(dlevel0>0 && dlevel100>0 && dlevel0>dlevel100)
{
double dsizeImpulse=ND1(Abs((dlevel0-dlevel100)/p));
dstopPrice=nd(dlevel0-p*dsizeImpulse*SL_Level/100-SL_Offset*p);
if(dstopFirst==0 || dstopPrice>dstopFirst)
{
DEBUG("(%d) %lld new stop: %.5f",__LINE__,m_position.Ticket(),dstopPrice);
m_trade.PositionModify(m_position.Ticket(),dstopPrice,0); //переставим стоп
}
}
}
else
if(itype==OP_SELL)
{
double dlevel0=m_global.LoadParam("short0",0);
double dlevel100=m_global.LoadParam("short100",0);
if(dlevel0>0 && dlevel100>0 && dlevel0<dlevel100)
{
double dsizeImpulse=ND1(Abs((dlevel0-dlevel100)/p));
dstopPrice=nd(dlevel0+p*dsizeImpulse*SL_Level/100+SL_Offset*p);
if(dstopFirst==0 || dstopPrice<dstopFirst)
{
DEBUG("(%d) %lld new stop: %.5f",__LINE__,m_position.Ticket(),dstopPrice);
m_trade.PositionModify(m_position.Ticket(),dstopPrice,0); //переставим стоп
}
}
}
}
else
if(SL==STOP_BREAK)
{
if(itype==OP_BUY)
{
double dlevel0=m_global.LoadParam("long0",0);
double dlevel100=m_global.LoadParam("long100",0);
if(dlevel0>0 && dlevel100>0 && dlevel0>dlevel100)
{
double dsizeImpulse=ND1(Abs((dlevel0-dlevel100)/p));
dstopPrice=nd(dlevel0-p*dsizeImpulse*SL_Level/100-SL_Offset*p);
bool bReverse=false;
if((dstopPrice-dopen)!=0 && dopen>dstopPrice && dclose<dstopPrice)
{
if(dclose<dopen && NormalizeDouble((dstopPrice-dclose)*100/(dopen-dclose),2)>=CloseSensitivity)
bReverse=true;
}
if((dopen<=dstopPrice && dclose<dstopPrice) || bReverse)
{
DEBUG("Close by SL = BREAK, stopPrice: %.5f Reverse: %s dopen: %.5f",dstopPrice,BoolToString(bReverse),dopen);
OrderClose(m_position.Ticket()); //закроем ордер (если их несколкьо они все будут проанализирвоаны и щакрыты в этой точке)
}
}
}
else
if(itype==OP_SELL)
{
double dlevel0=m_global.LoadParam("short0",0);
double dlevel100=m_global.LoadParam("short100",0);
if(dlevel0>0 && dlevel100>0 && dlevel0<dlevel100)
{
double dsizeImpulse=ND1(Abs((dlevel0-dlevel100)/p));
dstopPrice=nd(dlevel0+p*dsizeImpulse*SL_Level/100+SL_Offset*p);
bool bReverse=false;
if((dopen-dstopPrice)!=0 && dopen<dstopPrice && dclose>dstopPrice)
{
if(dclose>dopen && NormalizeDouble((dclose-dstopPrice)*100/(dclose-dopen),2)>=CloseSensitivity)
bReverse=true;
}
if((dopen>=dstopPrice && dclose>dstopPrice) || bReverse)
{
DEBUG("Close by SL = BREAK, stopPrice: %.5f Reverse: %s dopen: %.5f",dstopPrice,BoolToString(bReverse),dopen);
OrderClose(m_position.Ticket()); //закроем ордер (если их несколкьо они все будут проанализирвоаны и щакрыты в этой точке)
}
}
}
}//if
}
}
}
if(AddNew)
{
if(dstopBuy>0 && orders[OP_BUY]>1)
SetAll(OP_BUY,dstopBuy,-1,true,true); //если пирамидим, то входим
if(dstopSell>0 && orders[OP_SELL]>1)
SetAll(OP_SELL,dstopSell,-1,true,true); //если пирамидим, то входим
}
}
};
class CMain: public CMainDefault
{
protected:
CMyOrders m_main;
CNewBar m_bar;
CNewBar m_barM1;
CDrawPos m_pos;
int iFlatMinimalBars;
double dLevel0,dLevel100;
datetime tmTime0,tmTime100;
double m_freeRisk;
CTime m_time;
CTimer m_timer;
bool bfirst;
public:
void FindImpulse(string m_name,bool bFilter,ENUM_TIMEFRAMES etf,datetime &time0,double &level0,datetime &time100,double &level100)
{
if(level0<=0 || level100<=0)
{
return;
}
int icount=0;
int ibar0=-1,ibar100=-1;
double dhigh=0,dlow=0,dopen=0,dclose=0;
ibar0=iBarShift(m_name,etf,time0); //определим сколько баров от 0 точки
ibar100=iBarShift(m_name,etf,time100); //определим сколько баров от 100 точки
int imaxSize=(int)MathMin(ibar0,ibar100);
MqlRates rates[];
bool bUpdate=false;
if(CopyRates(m_name,etf,0,imaxSize+1,rates)==imaxSize+1) //загрузим данные
{
ArraySetAsSeries(rates,true);
for(int i=imaxSize; i>=0; i--)
{
dhigh=rates[i].high;//iHigh(m_name,etf,i);
dlow=rates[i].low;//iLow(m_name,etf,i);
dclose=rates[i].close;//iClose(m_name,etf,i);
dopen=rates[i].open; //iOpen(m_name,etf,i);
ibar0=iBarShift(m_name,etf,time0); //определим сколько баров от 0 точки
ibar100=iBarShift(m_name,etf,time100); //определим сколько баров от 100 точки
datetime tmDebug=iTime(m_name,tf,i);
if(level0>level100)
{
if((dclose<dopen || icount>0) && i>0)
{
icount++; //нужна хотя бы одна коррекционная свечка, с нее включаем анализ коррекций, но не от этйо свечки. от тайм0
}
if(dhigh>=level0 && level0>0)
{
level0=dhigh;
time0=rates[i].time;
int ibarsHigh=ibar0-i;
int ibarsLow=ibar0-i;
if(ibarsHigh>=0)
{
if(icount>0 && icount>iFlatMinimalBars)
{
int ihigh=iHighest(m_name,etf,MODE_HIGH,ibarsHigh+1,i); //ищем реальный максимум от точки 0
int ilow=iLowest(m_name,etf,MODE_LOW,ibarsLow+1,i);
if(ihigh!=-1)
{
time0=iTime(m_name,etf,ihigh); //верхняя точка
level0=iHigh(m_name,etf,ihigh);
if(dclose>=dopen)
icount=0; //не обновлять если свечка в другую сторону
}
if(ilow!=-1)
{
level100=iLow(m_name,etf,ilow);
time100=iTime(m_name,etf,ilow);
if(dclose>=dopen)
icount=0; //не обновлять если свечка в другую сторону
}
}
else
if(icount==0 || icount<=iFlatMinimalBars)
{
int ihigh=iHighest(m_name,etf,MODE_HIGH,ibarsHigh+1,i); //ищем реальный максимум от точки 0
if(ihigh!=-1)
{
time0=iTime(m_name,etf,ihigh); //верхняя точка
level0=iHigh(m_name,etf,ihigh);
if(dclose>=dopen)
icount=0; //не обновлять если свечка в другую сторону
}
}
if(!bFilter)
{
m_global.SaveParam("long0",level0);
m_global.SaveParam("long100",level100);
m_global.SaveParam("long0_time",time0);
m_global.SaveParam("long100_time",time100);
}
}
}
if(dlow<level100 && i>0)
{
bool bReverse=false;
if((dopen-level100)!=0 && dopen>level100 && dclose<level100)
{
if(dclose<dopen && NormalizeDouble((level100-dclose)*100/(dopen-dclose),2)>=ReverseSensitivity)
bReverse=true;
}
if((dopen<=level100 && dclose<level100) || bReverse)
{
int ibarsHigh=ibar100-i;
if(ibarsHigh>=0)
{
int ihigh=iHighest(m_name,etf,MODE_HIGH,ibarsHigh+1,i);
int ilow=iLowest(m_name,etf,MODE_LOW,ibarsHigh,i);
if(ihigh!=-1)
{
time100=iTime(m_name,etf,ihigh); //верхняя точка
level100=iHigh(m_name,etf,ihigh);
icount=0;
}
if(ilow!=-1)
{
time0=iTime(m_name,etf,ilow); //верхняя точка
level0=iLow(m_name,etf,ilow);
icount=0;
}
if(!bFilter)
{
m_global.SaveParam("short0",level0);
m_global.SaveParam("short100",level100);
m_global.SaveParam("short0_time",time0);
m_global.SaveParam("short100_time",time100);
}
}
}
}
}//long fibo
else
if(level0<level100)//short
{
if((dclose>dopen || icount>0) && i>0)
{
icount++; //нужна хотя бы одна коррекционная свечка, с нее включаем анализ коррекций, но не от этйо свечки. от тайм0
}
if(dlow<=level0 && level0>0)
{
level0=dlow;
time0=rates[i].time;
int ibarsLow=ibar0-i;
int ibarsHigh=ibar0-i;
if(ibarsLow>=0)
{
if(icount>0 && icount>iFlatMinimalBars)
{
int ilow=iLowest(m_name,etf,MODE_LOW,ibarsLow+1,i); //ищем реальный максимум от точки 0
int ihigh=iHighest(m_name,etf,MODE_HIGH,ibarsHigh+1,i);
if(ilow!=-1)
{
Показано первые 50% кода (символов: 39378)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.