locomotive v1.01 (21).mq4
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «locomotive v1.01 (21).mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Locomotive — советник для MetaTrader 4, который анализирует накопленный профит за определённый период и на его основе закрывает длинные убыточные позиции. Советник также реализует систему увеличения объёмов с настраиваемыми множителями и шагами, а также поддержку трейлинг-стопа.
В советнике реализованы два независимых направления торговли — покупка и продажа, каждое со своим магическим номером. Это позволяет управлять позициями в обе стороны раздельно. Имеется функция закрытия всех позиций при достижении суммарного профита, а также функция закрытия далеко от текущей цены позиций при выполнении условий по накопленному профиту.
Советник включает настраиваемую панель отображения информации на графике с данными о профите, убытках и удалённых позициях. Поддерживается работа как с текущим символом, так и со всеми символами на счёте. Доступны параметры объёма, стоп-лосса, тейк-профита, трейлинга и множества других торговых настроек.
Настройки программы
| Настройка | Описание |
|---|---|
| buy | Покупка — Включает или отключает открытие покупок. |
| sell | Продажа — Включает или отключает открытие продаж. |
| AllOrders | Все ордера — При активации закрывает все позиции при достижении суммарного профита в размере CloseProfit. |
| CloseProfit | Профит для закрытия всех — Порог суммарного профита для автоматического закрытия всех позиций. |
| take_profit | Тейк-профит (торговля) — Параметр тейк-профита, используемый при модификации ордеров в торговых функциях. |
| lot | Объём лота — Начальный объём лота для первого ордера. |
| lot_factor_1 | Множитель лота (этап 1) — Множитель увеличения объёма лота на первом этапе наращивания. |
| step_1 | Шаг (этап 1) — Шаг в пунктах для первого этапа наращивания. |
| set_2 | Переключатель объёма (этап) — Пороговый номер уровня, после которого применяется второй множитель объёма и шаг. |
| lot_factor_2 | Множитель лота (этап 2) — Множитель увеличения объёма лота на втором этапе наращивания. |
| step_2 | Шаг (этап 2) — Шаг в пунктах для второго этапа наращивания. |
| set_3 | Уровень хеджирования — Уровень, при достижении которого открывается хеджирующий ордер. |
| hedje_factor | Коэффициент хеджирования — Базовый коэффициент для расчёта объёма хеджирующего ордера. |
| hedje_plus | Дополнительный коэффициент хеджирования — Дополнительный коэффициент для расчёта объёма хеджирующего ордера в зависимости от количества уровней. |
| menucomment02 | Разделитель параметров — Текстовый разделитель для группировки настроек на панели. |
| magic | Магический номер покупок — Магический номер для ордеров направления покупки. |
| magic2 | Магический номер продаж — Магический номер для ордеров направления продажи. |
| TryToTrade | Попыток торговли — Максимальное количество попыток повторной отправки торгового запроса. |
| WaitTime | Время ожидания — Время ожидания в миллисекундах между повторными попытками торговых запросов. |
| CommetSize | Размер комментария — Количество строк в истории событий, отображаемых в комментарии на графике. |
| Стоп-лосс (Stoploss) | Стоп-лосс — Стоп-лосс в пунктах для ручного закрытия позиций по уровню. |
| Тейк-профит (Takeprofit) | Тейк-профит — Параметр тейк-профита, используемый при модификации ордеров в торговых функциях. |
| Длина трала (TrailingStop) | Длина трала — Длина трейлинг-стопа в пунктах. |
| Минимальная прибыль для старта (TrailingStart) | Минимальная прибыль для старта — Минимальная прибыль в пунктах для активации трейлинг-стопа. |
| Шаг трала (TrailingStep) | Шаг трала — Шаг трейлинг-стопа в пунктах. |
| AllSymbol | Все символы — При активации советник работает со всеми символами, а не только с текущим. |
| Magic (-1 all) (Magic) | Магический номер — Магический номер для фильтрации ордеров. Значение -1 означает все магические номера. |
| за какое кол-во дней считать накопленный профит (DayProfit) | за какое кол-во дней считать накопленный профит — Количество дней, за которые считается накопленный профит для функции закрытия далёких позиций. |
| неснижаемый накопленный профит (ProfitMin) | неснижаемый накопленный профит — Неснижаемый накопленный профит — минимальная сумма профита, при которой возможно закрытие далёких позиций. |
| минимальный убыток сделки подлежащей закрытию (пункт) (MinLoss) | минимальный убыток сделки подлежащей закрытию (пункт) — Минимальный убыток сделки в пунктах, при котором позиция считается далёкой и подлежит анализу на закрытие. |
| Font | Шрифт панели — Шрифт текста на панели информации графика. |
| Width | Толщина шрифта — Толщина шрифта текста на панели информации. |
| X | Позиция X панели — Горизонтальное смещение панели информации от левого верхнего угла графика. |
| Y | Позиция Y панели — Вертикальное смещение панели информации от левого верхнего угла графика. |
| CloseFar | Закрытие далёких позиций — Переключатель для закрытия позиций, находящихся далеко от текущей цены, при выполнении условий по накопленному профиту. |
| StartingLots | Начальный объём — Начальный объём лота для расчёта размеров позиций. |
| TakeProfit | Тейк-профит — Тейк-профит в пунктах для ручного закрытия позиций по уровню. |
| Layer_multiplier | Множитель лота — Множитель лота, выбираемый из перечисленных вариантов от x1 до x2. |
| PipStep | Шаг в пунктах — Шаг в пунктах для определения момента открытия новых сделок. |
| Identifier | Идентификатор — Настройка идентификатора, определяющая вариант расчёта объёмов (от 1 до 4). |
Поиск по коду файла
#include <stdlib.mqh>
input bool buy = true;
input bool sell = true;
input bool AllOrders = false;
input double CloseProfit = 25;
input double take_profit = 15;
input double lot = 0.01;
input double lot_factor_1 = 1.6;
input double step_1 = 25;
input double set_2 = 4;
input double lot_factor_2 = 1.7;
input double step_2 = 35;
input double set_3 = 8;
input double hedje_factor = 0.5;
input double hedje_plus = 0.05;
input string menucomment02 = "||||||||||||||||||||||||||||||||||||||||||||| Прочие параметры |||||||||||||||||||||||||||||||||||||||||||||";
input int magic = 1543;
input int magic2 = 1544;
double Sensitivity = 1;
input int TryToTrade = 20;
input int WaitTime = 1500;
input int CommetSize = 7;
input int Stoploss = 0; // Стоп-лосс
input int Takeprofit = 0; // Тейк-профит
input int TrailingStop = 5; // Длина трала
input int TrailingStart = 5; // Минимальная прибыль для старта
input int TrailingStep = 1; // Шаг трала
int _X = 0; //смещение панели по горизонтали
int _Y = 25; //смещение панели по вертикали
#property description "The EA analyzes the profit for a certain time and closes long-term losing positions due to this profit."
extern bool AllSymbol = false;
extern int Magic = -1; //Magic (-1 all)
extern int DayProfit = 1;//за какое кол-во дней считать накопленный профит
extern double ProfitMin = 1.00;//неснижаемый накопленный профит
extern int MinLoss = 100;//минимальный убыток сделки подлежащей закрытию (пункт)
extern string Font = "Times New Roman";
extern int Width = 10;
extern long X=30;
extern long Y=30;
extern bool CloseFar = false;
bool LANGUAGE;
double STOPLEVEL;
string AC;
string Default = "Default set All Pair";
string Timeframe = "TimeFrame M5";
enum M
{
a, //x2
B, //x1.9
c, //x1.8
d, //x1.7
e, //x1.6
f, //x1.5
g, //x1.4
h, //x1.3
I, //x1.2(Default)
j, //x1.1
k //x1
};
enum N
{
l, //1
m, //2
n, //3
o, //4
};
double stoploss = 5000.0;
double TrailStart = 100.0;
double TrailStop = 100.0;
extern double StartingLots = 0.01;
extern double TakeProfit = 58.0;
double Multiplier;
input M Layer_multiplier = I;
extern double PipStep = 48.0;
bool AutoCompound = false;
int MagicNumber = 0;
double slip = 30.0;
int MaxTrades = 99999;
int identifier = 2;
input N Identifier = l;
string MoneyManagement = "AutoLot";
bool AutoMoneyManagement = false;
double PercentToRisk = 0.02;
double TahananModal = 10000.0;
bool UseEquityStop = false;
double TotalEquityRisk = 20.0;
bool UseTrailingStop = false;
bool UseTimeOut = false;
double MaxTradeOpenHours = 48.0;
double PriceTarget, StartEquity, BuyTarget, SellTarget ;
double AveragePrice, SellLimit, BuyLimit ;
double LastBuyPrice, LastSellPrice, Spread;
bool flag;
int timeprev = 0, expiration;
int NumOfTrades = 0;
double iLots;
int cnt = 0, total;
double Stopper = 0.0;
bool TradeNow = false, LongTrade = false, ShortTrade = false;
int ticket;
bool NewOrdersPlaced = false;
double AccountEquityHighAmt, PrevEquity;
double TrallB = 0;
double TrallS = 0;
int slippage =30;
int i,Ticket, DG, LastError, TimeB, TimeS;
bool TickeT, Work=true;
double Pp, Mnoj, Mnoj2;
string Symb,CommentBox[],cm2;
double lt[30],lt_h[30],step[30];
void OnTick(){
// код доступен только после оплаты
}
void OnTimer()
{
Info();
if(Work==false)
return;
if(buy&&ObjectGetInteger(0,"B",OBJPROP_STATE)==false)
buyf();
if(sell&&ObjectGetInteger(0,"S",OBJPROP_STATE)==false)
sellf();
if(OrdersTotal()>0 && ObjectGetInteger(0,"C",OBJPROP_STATE)==1)
{
CloseAll();
ObjectSetInteger(0,"C",OBJPROP_STATE,false);
}
if(AllOrders)
{
if(GetProfitOpenPosInCurrency("",-1,-1)>CloseProfit)
CloseAll();
}
else
{
if(GetProfitOpenPosInCurrency("",0,-1)>CloseProfit)
CloseAll(0);
if(GetProfitOpenPosInCurrency("",1,-1)>CloseProfit)
CloseAll(1);
{
double OOP,SL;
int b=0,s=0,tip,TicketB=0,TicketS=0;
for(i=0; i<OrdersTotal()-1; i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol())
{
tip = OrderType();
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
if(tip==OP_BUY)
{
b++;
TicketB=OrderTicket();
if(Stoploss!=0 && Bid<=OOP - Stoploss * Point)
{
if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),slippage,clrNONE))
continue;
}
if(Takeprofit!=0 && Bid>=OOP + Takeprofit * Point)
{
if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),slippage,clrNONE))
continue;
}
if(TrailingStop>0)
{
SL=NormalizeDouble(Bid-TrailingStop*Point,Digits);
if(SL>=OOP+TrailingStart*Point && (TrallB==0 || TrallB+TrailingStep*Point<SL))
TrallB=SL;
}
}
if(tip==OP_SELL)
{
s++;
if(Stoploss!=0 && Ask>=OOP + Stoploss * Point)
{
if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),slippage,clrNONE))
continue;
}
if(Takeprofit!=0 && Ask<=OOP - Takeprofit * Point)
{
if(OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),slippage,clrNONE))
continue;
}
TicketS=OrderTicket();
if(TrailingStop>0)
{
SL=NormalizeDouble(Ask+TrailingStop*Point,Digits);
if(SL<=OOP-TrailingStart*Point && (TrallS==0 || TrallS-TrailingStep*Point>SL))
TrallS=SL;
}
}
}
}
}
}
if(b!=0)
{
if(b>0)
if(TrallB!=0)
{
Print("Тралим ордер ",TicketB);
DrawHline("SL Buy",TrallB,clrBlue,0);
if(Bid<=TrallB)
{
if(OrderSelect(TicketB,SELECT_BY_TICKET))
if(OrderProfit()>0)
if(!OrderClose(TicketB,OrderLots(),NormalizeDouble(Ask,Digits),slippage,clrRed))
Print("Ошибка закрытия ордера ",GetLastError());
}
}
}
else
{
TrallB=0;
ObjectDelete("SL Buy");
}
if(s!=0)
{
if(s>0)
if(TrallS!=0)
{
Print("Тралим ордер ",TicketS);
DrawHline("SL Sell",TrallS,clrRed,0);
if(Ask>=TrallS)
{
if(OrderSelect(TicketS,SELECT_BY_TICKET))
if(OrderProfit()>0)
if(!OrderClose(TicketS,OrderLots(),NormalizeDouble(Ask,Digits),slippage,clrRed))
Print("Ошибка закрытия ордера ",GetLastError());
}
}
}
else
{
TrallS=0;
ObjectDelete("SL Sell");
}
/* int err;
if(IsTesting() && OrdersTotal()==0)
{
double Lot=0.02;
err=OrderSend(Symbol(),OP_BUY,Lot,NormalizeDouble(Ask,Digits),slippage,0,0,"тест",0);
err=OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),slippage,0,0,"тест",0);
}*/
}
{
AC=" "+AccountCurrency();
EventSetTimer(1);
}
{
if(ObjectFind("cm_FAR")==0)
{
ObjectGetInteger(0,"cm_FAR",OBJPROP_XDISTANCE,0,X);
ObjectGetInteger(0,"cm_FAR",OBJPROP_YDISTANCE,0,Y);
}
else
{
RectLabelCreate(0,"cm_FAR",0,X,Y,200,105,clrWhite,clrBlack,STYLE_SOLID,3,false,true,true,0);
}
RectLabelCreate(0,"cm__fon1",0,X+1,Y+1,198,103,clrLemonChiffon,clrLightGray,STYLE_SOLID,1,false,false,true,0);
RectLabelCreate(0,"cm__0_",0,X+1,Y+1,198,18,clrBlue,clrLightGray,STYLE_SOLID,1,false,false,true,0);
RectLabelCreate(0,"cm__fon2",0,X+3,Y+40,194,39,clrWhite,clrLightGray,STYLE_SOLID,1,false,false,true,0);
LabelCreate(0,"cm__00",0,X+10,Y+10,CORNER_LEFT_UPPER,"ea Close Far",Font,Width+0,clrWhite,0,ANCHOR_LEFT,false,false,true,0);
LabelCreate(0,"cm__01",0,X+10,Y+30,CORNER_LEFT_UPPER,StringConcatenate("Profit ",!AllSymbol?Symbol():"all symbols"),Font,Width+0,clrBlack,0,ANCHOR_LEFT,false,false,true,0);
ButtonCreate(0,"cm__kn 01",0,X+3,Y+82,97,18,"All Symbols",Font,Width,clrBlack,clrLightGray,AllSymbol);
ButtonCreate(0,"cm__kn 02",0,X+100,Y+82,97,18,"Close FAR",Font,Width,clrBlack,clrLightGray,CloseFar);
AllSymbol = ObjectGetInteger(0,"cm__kn 01",OBJPROP_STATE);
CloseFar = ObjectGetInteger(0,"cm__kn 02",OBJPROP_STATE);
RefreshRates();
STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
double PriceFar=0,LossFar=0,LotFar=0;
int TicketFar=0;
int TicketLoss=0;
double Loss=0,LotLoss=0,ProfitLoss=0;
double Profit=0;
string symb=NULL;
for(i=0; i<OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()!=Symbol() && !AllSymbol)
continue;
if(Magic!=OrderMagicNumber() && Magic!=-1)
continue;
Profit=OrderProfit()+OrderCommission()+OrderSwap();
if(Loss>Profit)
{
Loss=Profit;
TicketLoss=OrderTicket();
LotLoss = OrderLots();
}
OOP=OrderOpenPrice();
if(MathAbs(OOP-(Ask+Bid)/2)>PriceFar && MathAbs(OOP-(Ask+Bid)/2)/Point >=MinLoss && Profit<0)
{
LossFar=Profit;
TicketFar=OrderTicket();
PriceFar=MathAbs(OOP-(Ask+Bid)/2);
LotFar = OrderLots();
symb = OrderSymbol();
}
}
}
LabelCreate(0,"cm__05",0,X+10,Y+50,CORNER_LEFT_UPPER,StringConcatenate("Far ",TicketFar),Font,Width+0,clrBlack,0,ANCHOR_LEFT,false,false,true,0);
LabelCreate(0,"cm__06",0,X+190,Y+50,CORNER_LEFT_UPPER,StringConcatenate(DoubleToString(LossFar,2),AC),Font,Width+0,clrBlack,0,ANCHOR_RIGHT,false,false,true,0);
LabelCreate(0,"cm__07",0,X+10,Y+70,CORNER_LEFT_UPPER,StringConcatenate(DoubleToString(LotFar,2)," ",symb),Font,Width+0,clrBlack,0,ANCHOR_LEFT,false,false,true,0);
Profit=0;
for(i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
{
if(OrderSymbol()!=Symbol() && !AllSymbol)
continue;
if(Magic!=OrderMagicNumber() && Magic!=-1)
continue;
if(OrderCloseTime()>=iTime(NULL,1440,DayProfit))
Profit+=OrderProfit()+OrderSwap()+OrderCommission();
}
}
LabelCreate(0,"cm__02",0,X+190,Y+30,CORNER_LEFT_UPPER,StringConcatenate(DoubleToString(Profit,2),AC),Font,Width+0,clrBlack,0,ANCHOR_RIGHT,false,false,true,0);
if(CloseFar && Profit>ProfitMin)
{
if(LossFar+Profit-ProfitMin>0)
{
if(OrderSelect(TicketFar,SELECT_BY_TICKET))
{
tip = OrderType();
int DIGITS = (int)MarketInfo(OrderSymbol(),MODE_DIGITS);
if(tip==OP_BUY)
{
if(OrderClose(TicketFar,OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),DIGITS),100,clrNONE))
Alert("ea Close Far Order <<",TicketFar,">> ",OrderSymbol()," Loss=",DoubleToString(OrderProfit()+OrderSwap()+OrderCommission(),2),AC);
}
if(tip==OP_SELL)
{
if(OrderClose(TicketFar,OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),DIGITS),100,clrNONE))
Alert("ea Close Far Order <<",TicketFar,">> ",OrderSymbol()," Loss=",DoubleToString(OrderProfit()+OrderSwap()+OrderCommission(),2),AC);
}
}
}
}/*
}
{
Spread = MarketInfo(Symbol(), MODE_SPREAD) * Point;
Comment("",
"\n Copyright ? 2017, BuBat's Tradings ",
"\n EA - Budak Ubat v1.51 ",
"\n Equity = ", AccountEquity(),
"\n Starting Lot =", StartingLots);
return (0);
}
int deinit()
{
return (0);
}*/
/* string expire_date = ea_times_up; //<-- hard coded datetime
datetime e_d = StrToTime(expire_date);
if(CurTime() >= e_d)
{
Alert("Trial EA Finished!!! Contact: ");
return(0);
}
string NEA = "EA - Budak Ubat v1.51";
if(NEA != WindowExpertName())
{
Comment(" \nEXPERT NAME WAS RENAMED/CHANGED! \nTRADE IS STOPED/NOT ALLOWED!");
Print("Trade STOPED! RENAMED NAME EA, WITHOUT PERMIT! update your license to owner...");
return (0);*/
}
Info();
Info();
double Lots = MarketInfo(Symbol(),MODE_MINLOT);
switch(Layer_multiplier)
{
case a:
Multiplier = 2;
break;
case B:
Multiplier = 1.9;
break;
case c:
Multiplier = 1.8;
break;
case d:
Multiplier = 1.7;
break;
case e:
Multiplier = 1.6;
break;
case f:
Multiplier = 1.5;
break;
case g:
Multiplier = 1.4;
break;
case h:
Multiplier = 1.3;
break;
case I:
Multiplier = 1.2;
break;
case j:
Multiplier = 1.1;
break;
case k:
Multiplier = 1;
break;
}
switch(identifier)
{
case l:
identifier = 1;
break;
case m:
identifier = 2;
break;
case n:
identifier = 3;
break;
case o:
identifier = 4;
break;
}
double Ld_40 = PercentToRisk / TahananModal;
if(AutoCompound==true)
StartingLots = NormalizeDouble(AccountBalance() * Ld_40 / MarketInfo(Symbol(), MODE_TICKVALUE), 2);
double PrevCl;
double CurrCl;
if(UseTrailingStop)
TrailingAlls(TrailStart, TrailStop, AveragePrice);
if(UseTimeOut)
{
if(TimeCurrent() >= expiration)
{
CloseThisSymbolAll();
Print("Closed All due to TimeOut");
}
}
if(timeprev == Time[0])
return;
timeprev = Time[0];
double CurrentPairProfit = CalculateProfit();
if(UseEquityStop)
{
if(CurrentPairProfit < 0.0 && MathAbs(CurrentPairProfit) > TotalEquityRisk / 100.0 * AccountEquityHigh())
{
CloseThisSymbolAll();
Print("Closed All due to Stop Out");
NewOrdersPlaced = false;
}
}
total = CountTrades();
if(total == 0)
flag = false;
for(cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
{
(int)OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() != Symbol() || OrderMagicNumber() != magic)
continue;
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
if(OrderType() == OP_BUY)
{
LongTrade = true;
ShortTrade = false;
break;
}
}
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
if(OrderType() == OP_SELL)
{
LongTrade = false;
ShortTrade = true;
break;
}
}
}
if(total > 0 && total <= MaxTrades)
{
RefreshRates();
LastBuyPrice = FindLastBuyPrice();
LastSellPrice = FindLastSellPrice();
if(LongTrade && LastBuyPrice - Ask >= PipStep * Point)
TradeNow = true;
if(ShortTrade && Bid - LastSellPrice >= PipStep * Point)
TradeNow = true;
}
if(total < 1)
{
ShortTrade = false;
LongTrade = false;
TradeNow = true;
StartEquity = AccountEquity();
}
if(TradeNow)
{
LastBuyPrice = FindLastBuyPrice();
LastSellPrice = FindLastSellPrice();
if(ShortTrade)
{
NumOfTrades = total;
iLots = NormalizeDouble(StartingLots * MathPow(Multiplier, NumOfTrades), identifier);
RefreshRates();
ticket = OpenPendingOrder(1, iLots, Bid, slip, Ask, 0, 0, NumOfTrades, magic, 0, HotPink);
if(ticket < 0)
{
Print("Error: ", GetLastError());
return;
}
LastSellPrice = FindLastSellPrice();
TradeNow = false;
NewOrdersPlaced = true;
}
else
{
if(LongTrade)
{
NumOfTrades = total;
iLots = NormalizeDouble(StartingLots * MathPow(Multiplier, NumOfTrades), identifier);
ticket = OpenPendingOrder(0, iLots, Ask, slip, Bid, 0, 0, NumOfTrades, magic, 0, Lime);
if(ticket < 0)
{
Print("Error: ", GetLastError());
return;
}
LastBuyPrice = FindLastBuyPrice();
TradeNow = false;
NewOrdersPlaced = true;
}
}
}
if(TradeNow && total < 1)
{
PrevCl = iClose(Symbol(), 0, 2);
CurrCl = iClose(Symbol(), 0, 1);
SellLimit = Bid;
BuyLimit = Ask;
if(!ShortTrade && !LongTrade)
{
NumOfTrades = total;
iLots = NormalizeDouble(StartingLots * MathPow(Multiplier, NumOfTrades), identifier);
if(PrevCl > CurrCl)
{
if(iRSI(NULL, PERIOD_M5, 5, PRICE_CLOSE, 1) > 56.0) //?????? >
{
ticket = OpenPendingOrder(1, iLots, SellLimit, slip, SellLimit, 0, 0, NumOfTrades, magic, 0, HotPink);
if(ticket < 0)
{
Print("Error: ", GetLastError());
return;
}
LastBuyPrice = FindLastBuyPrice();
NewOrdersPlaced = true;
}
}
else
{
if(iRSI(NULL, PERIOD_M5, 5, PRICE_CLOSE, 1) < 36.0) // ?????? <
{
ticket = OpenPendingOrder(0, iLots, BuyLimit, slip, BuyLimit, 0, 0, NumOfTrades, magic, 0, Lime);
if(ticket < 0)
{
Print("Error: ", GetLastError());
return;
}
LastSellPrice = FindLastSellPrice();
NewOrdersPlaced = true;
}
}
if(ticket > 0)
expiration = TimeCurrent() + 60.0 * (60.0 * MaxTradeOpenHours);
TradeNow = false;
}
}
total = CountTrades();
AveragePrice = 0;
double Count = 0;
for(cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
{
(int)OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() != Symbol() || OrderMagicNumber() != magic)
continue;
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
if(OrderType() == OP_BUY || OrderType() == OP_SELL)
{
AveragePrice += OrderOpenPrice() * OrderLots();
Count += OrderLots();
}
}
}
if(total > 0)
AveragePrice = NormalizeDouble(AveragePrice / Count, Digits);
if(NewOrdersPlaced)
{
for(cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
{
(int)OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() != Symbol() || OrderMagicNumber() != magic)
continue;
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
if(OrderType() == OP_BUY)
{
PriceTarget = AveragePrice + TakeProfit * Point;
BuyTarget = PriceTarget;
Stopper = AveragePrice - stoploss * Point;
flag = true;
}
}
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
{
if(OrderType() == OP_SELL)
{
PriceTarget = AveragePrice - TakeProfit * Point;
SellTarget = PriceTarget;
Stopper = AveragePrice + stoploss * Point;
flag = true;
}
}
}
}
if(NewOrdersPlaced)
{
if(flag == true)
{
for(cnt = OrdersTotal() - 1; cnt >= 0; cnt--)
{
(int)OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol() != Symbol() || OrderMagicNumber() != magic)
continue;
if(OrderSymbol() == Symbol() && OrderMagicNumber() == magic)
(int)OrderModify(OrderTicket(), AveragePrice, OrderStopLoss(), PriceTarget, 0, Yellow);
NewOrdersPlaced = false;
}
}
}
return;
}
bool ButtonCreate(const long chart_ID=0, // ID графика
const string name="Button", // имя кнопки
const int sub_window=0, // номер подокна
const long _x=0, // координата по оси X
const long _y=0, // координата по оси Y
const int width=50, // ширина кнопки
const int height=18, // высота кнопки
const string text="Button", // текст
const string font="Arial", // шрифт
const int font_size=8,// размер шрифта
const color clr=clrBlack,// цвет текста
const color clrON=clrLightGray,// цвет фона
const color clrOFF=clrLightGray,// цвет фона
const color border_clr=clrNONE,// цвет границы
const bool state=false, //
const ENUM_BASE_CORNER CORNER=CORNER_RIGHT_UPPER)
{
if(ObjectFind(chart_ID,name)==-1)
{
ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0);
ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,CORNER);
ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
ObjectSetInteger(chart_ID,name,OBJPROP_BACK,0);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,0);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,0);
ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,1);
ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,1);
ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
}
ObjectSetInteger(chart_ID,name,OBJPROP_BORDER_COLOR,border_clr);
color back_clr;
if(ObjectGetInteger(chart_ID,name,OBJPROP_STATE))
back_clr=clrON;
else
back_clr=clrOFF;
ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,_x+_X);
ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,_y+_Y);
return(true);
}
void OnDeinit(const int reason)
{
if(reason==REASON_REMOVE)
ObjectsDeleteAll(0,"cm_FAR");
ObjectsDeleteAll(0,"cm__");
{
ObjectsDeleteAll(0,"");
}
Comment("");
EventKillTimer();
}
void buyf()
{
int market,lock;
double lastprice;
double price,slot;
double del_price, del_slot;
for(i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic)
{
if(OrderType()==0)
{
market++; //счётчик buy
if(OrderOpenPrice()<lastprice || lastprice==0)
lastprice=OrderOpenPrice(); //обновление lastprice по цене последнего открытого ордера buy
}
else
{
lock++; //счётчик sell
}
}
}
if(market!=0 || lock!=0)
{
for(i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symb && OrderMagicNumber()==magic && OrderCloseTime()>TimeB)
{
del_price=OrderOpenPrice();
del_slot=OrderLots();
for(i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic)
{
if(OrderType()==0)
slot+=OrderLots();
else
slot-=OrderLots();
}
}
slot =slot-del_slot;
for(i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic&& slot>0)
{
if(OrderType()==0)
price+=OrderOpenPrice()*(OrderLots()/slot);
else
price-=OrderOpenPrice()*(OrderLots()/slot);
}
}
price = price - del_price;
price=NormalizeDouble(price+take_profit*Pp,Digits);
/* for(i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic)
{
if(OrderType()==0)
ModifyOrder(OrderTicket(),-1,1,price);
else
ModifyOrder(OrderTicket(),-1,price+(Ask-Bid),1);
}
}*/
TimeB=TimeCurrent(); //обновление TimeB по нынешнему времени
return;
}
}
}
if(market==0)
{
TimeB=TimeCurrent();
SendOrder(0,lt[0],-1,1,0,1,take_profit,magic); //открытие ордера на покупку если нет открытых buy
}
if(market>0 && Ask<lastprice-step[market-1]*Pp) //если есть ордер на покупку и цена ask меньше чем последняя цена по buy с учётом уставки и шага
{
SendOrder(0,lt[market],-1,1,0,1,0,magic);
if(market>=set_3-1)
SendOrder(1,lt_h[market],-1,1,0,1,0,magic); //открытие хеджирующего ордера при достижении отметки на set_3
for(i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic)
{
if(OrderType()==0)
slot+=OrderLots();
else
slot-=OrderLots();
}
}
for(i=OrdersTotal()-1; i>=0 ; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic&& slot>0)
{
if(OrderType()==0)
price+=OrderOpenPrice()*(OrderLots()/slot);
else
price-=OrderOpenPrice()*(OrderLots()/slot);
}
}
price=NormalizeDouble(price+take_profit*Pp,Digits);
/*for(i=OrdersTotal()-1; i>=0 ; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic)
{
if(OrderType()==0)
ModifyOrder(OrderTicket(),-1,-1,price);
else
ModifyOrder(OrderTicket(),-1,price+(Ask-Bid),-1);
}
}*/
}
}
void sellf()
{
int market,lock;
double lastprice;
double price,slot;
double del_price, del_slot;
for(i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic2)
{
if(OrderType()==1)
{
market++;
if(OrderOpenPrice()>lastprice)
lastprice=OrderOpenPrice();
}
else
{
lock++;
}
}
}
if(market!=0 || lock!=0)
{
for(i=OrdersHistoryTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symb && OrderMagicNumber()==magic2 && OrderCloseTime()>TimeS)
{
for(i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic2)
{
if(OrderType()==0)
slot+=OrderLots();
else
slot-=OrderLots();
}
}
slot =slot-del_slot;
for(i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic2&& slot>0)
{
if(OrderType()==0)
price+=OrderOpenPrice()*(OrderLots()/slot);
else
price-=OrderOpenPrice()*(OrderLots()/slot);
}
}
price = price - del_price;
price=NormalizeDouble(price-take_profit*Pp,Digits);
/* for(i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic2)
{
if(OrderType()==0)
ModifyOrder(OrderTicket(),-1,-1,price);
else
ModifyOrder(OrderTicket(),-1,price-(Ask-Bid),-1);
}
}*/
TimeS=TimeCurrent();
return;
}
}
}
if(market==0)
{
TimeS=TimeCurrent();
SendOrder(1,lt[0],-1,1,0,1,take_profit,magic2);
}
if(market>0 && Bid>lastprice+step[market-1]*Pp)
{
SendOrder(1,lt[market],-1,1,0,1,0,magic2);
if(market>=set_3-1)
SendOrder(0,lt_h[market],-1,1,0,1,0,magic2);
for(i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==magic2)
{
if(OrderType()==1)
slot+=OrderLots();
else
slot-=OrderLots();
}
Показано первые 50% кода (символов: 41618)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.