ms_4.mq4
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «ms_4.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Продукт представляет собой торгового советника для платформы MetaTrader 4, написанного на языке MQL4. Советник реализует систему управления несколькими ордерами, построенную на принципе сетки (grid) с настраиваемым шагом между ценовыми уровнями.
Советник автоматически инициализирует торговые позиции, формирует отложенные ордера (Buy/Sell Stop и Buy/Sell Limit) на рассчитанных ценовых уровнях, а также корректирует стоп-лоссы и тейк-профиты в зависимости от текущего состояния рынка. Лот-сизирование основано на балансе счёта.
При достижении заданного количества уровней сетки активируется механизм блокировки, после которого советник переходит в режим фиксации позиций. Основная логика обрабатывается в функции start(), характерной для MQL4.
Настройки программы
| Настройка | Описание |
|---|---|
| grid | grid — Шаг сетки (в ценовых единицах), используемый для определения ценовых уровней при размещении ордеров. |
Поиск по коду файла
#include <stdlib.mqh>
#include <stderror.mqh>
extern double grid = 20;
double gridstep = 6;
double multk[25] = {1,1,1,1.5,2.5,6,7};
int limit = 4;
double lotseq[25] = {1,1,2.8,6,10.2,21,39.4};
double stepseq[25];
double gridseqbuy[25];
double gridseqsell[25];
double spred;
int lastlock, step;
int stateold, statecur;
int sleeppage = 3;
int magic = 120976;
double currentprice, oldprice;
bool setall;
int lastbuy, lastsell, profitorder;
double bsp, bstp, slp, sltp, ssp, sstp, blp, bltp;
int Initialization() {
statecur = 0;
stateold=statecur;
spred=MarketInfo(Symbol(), MODE_SPREAD)*Point;
RefreshRates();
currentprice = Bid;
OpenOrder (OP_SELL, LotSize(0), Bid, Bid+400*Point, Ask-grid*Point, "", magic, Red);
OpenOrder (OP_BUY, LotSize(0), Ask, Ask-400*Point, Bid+grid*Point, "", magic, Green);
step = 0;
for(int i=0;i<=gridstep;i++)
{
stepseq[i]=multk[i]*grid*Point;
}
setall = SetOrders (LotSize(1), LotSize(1), LotSize(1), LotSize(1));
SearchLastSellBuy();
lastlock=0;
return(0);
}
bool First(){
int ordcnt=0;
for (int cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if ((OrderSymbol() == Symbol()) && (OrderTicket() > lastlock) && ((OrderType() == OP_BUY) || (OrderType() == OP_SELL))) {ordcnt++;}
}
if (ordcnt>0) {return(false);}
else {return(true);}
}
double LotSize(int tstep) {
for (int i=0;i<=limit;i++)
double alots=lotseq[i]+alots;
alots++;
double rez = NormalizeDouble((AccountBalance()/alots/1000)*lotseq[tstep],1);
if (rez < 0.1) {rez = 0.1;}
return(rez);
}
bool AllPresent() {
int buycnt = 0;
int sellcnt = 0;
int buystopcnt = 0;
int buylimitcnt = 0;
int sellstopcnt = 0;
int selllimitcnt = 0;
for (int cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if ((OrderSymbol() == Symbol()) && (OrderTicket() > lastlock))
{
switch (OrderType())
{
case 0: buycnt++;
break;
case 1: sellcnt++;
break;
case 2: buylimitcnt++;
break;
case 3: selllimitcnt++;
break;
case 4: buystopcnt++;
break;
case 5: sellstopcnt++;
break;
}
}
}
if (buycnt > sellcnt) {step = buycnt-1;} else {step = sellcnt-1;}
Print ("Step=",step," Buy=",buycnt," Sell=",sellcnt," BuyStopCnt==",buystopcnt," BuyLimitCnt==",buylimitcnt," SellStopCnt==",sellstopcnt," SellLimitCnt==",selllimitcnt," Bid=",Bid);
if ((buystopcnt==0) || (buylimitcnt==0) || (sellstopcnt==0) || (selllimitcnt==0)) {return(false);}
else {return(true);}
}
int SearchLastSellBuy(){
lastbuy=0;
lastsell=0;
for (int cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if ((OrderSymbol() == Symbol()) && (OrderTicket() > lastlock) && (OrderType() == OP_BUY))
{
if (OrderTicket()>lastbuy) {lastbuy=OrderTicket();}
}
if ((OrderSymbol() == Symbol()) && (OrderTicket() > lastlock) && (OrderType() == OP_SELL))
{
if (OrderTicket()>lastsell) {lastsell=OrderTicket();}
}
}
return(0);
}
bool OpenOrder(int cmd, double vol, double prc, double stl, double tpt, string com, int mag, color clr) {
int err, max;
prc=NormalizeDouble(prc,Digits);
stl=NormalizeDouble(stl,Digits);
tpt=NormalizeDouble(tpt,Digits);
vol=NormalizeDouble(vol,1);
int ticket = -1;
max = 100;
while ((ticket < 0) && (max != 0))
{
RefreshRates();
ticket=OrderSend(Symbol(), cmd, vol, prc, sleeppage, stl, tpt, com, mag, 0, clr);
err=GetLastError();
if (ticket == -1)
{
Comment("Error=", err, " ", ErrorDescription(err));
Sleep(6000);
}
else
{Comment(" ");}
max--;
}
Sleep(1000);
if (max != 0) {return(true);}
else {return(false);}
}
int TakeProfit(){
profitorder=0;
for (int cnt=HistoryTotal()-1;cnt>=0;cnt--)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY);
if ((OrderType() == OP_SELL) || (OrderType() == OP_BUY))
if (OrderTicket() > profitorder)
if (OrderClosePrice() == OrderTakeProfit()) {profitorder = OrderTicket();}
}
return(profitorder);
}
int LockSearch(){
lastlock = 0;
for (int cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == 1001001) && (OrderType() == OP_BUY))
{
if (OrderTicket()>lastlock) {lastlock=OrderTicket();}
}
if ((OrderSymbol() == Symbol()) && (OrderMagicNumber() == 1001001) && (OrderType() == OP_SELL))
{
if (OrderTicket()>lastlock) {lastlock=OrderTicket();}
}
}
return(0);
}
bool SetOrders(double bs, double sl, double ss, double bl){
bool rez, temp;
rez = true;
if (statecur==0)
{
bsp=currentprice+stepseq[0]+spred;
bstp=currentprice+stepseq[0]+stepseq[0];
slp=currentprice+stepseq[0];
sltp=currentprice+spred;
ssp=currentprice-stepseq[0];
sstp=currentprice-stepseq[0]-stepseq[0]+spred;
blp=currentprice-stepseq[0]+spred;
bltp=currentprice;
}
if (statecur==-1)
{
bsp=currentprice+stepseq[step-1]+spred;
bstp=currentprice+stepseq[step-1]+stepseq[0];
slp=currentprice+stepseq[step-1];
sltp=currentprice+stepseq[step-1]-stepseq[0]+spred;
ssp=currentprice-stepseq[step];
if (step == limit) {sstp=currentprice-stepseq[step]-stepseq[0]+spred;}
else {sstp=currentprice-stepseq[step]-stepseq[step+1]+spred;}
blp=currentprice-stepseq[step]+spred;
if (step == limit) {bltp=currentprice-stepseq[step]+stepseq[0];}
else {bltp=currentprice;}
}
if (statecur==1)
{
bsp=currentprice+stepseq[step]+spred;
if (step == limit) {bstp=currentprice+stepseq[step]+stepseq[0];}
else {bПоказано первые 50% кода (символов: 8284)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.