ms_2.mq4
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «ms_2.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Советник для MetaTrader 4, реализующий сеточную торговую стратегию. Он размещает отложенные ордера (buy stop, sell stop, buy limit, sell limit) на рассчитанных уровнях цены относительно текущей рыночной стоимости. При срабатывании стоп-лосса или тейк-профита советник пересчитывает уровни сетки, корректирует стоп-лоссы и размещает новые отложенные ордера для продолжения торговли в направлении движения цены. В коде также присутствуют функции удаления ненужных ордеров и фиксации позиций при достижении заданных условий.
Настройки программы
| Настройка | Описание |
|---|---|
| grid | Шаг сетки — Задаёт расстояние между уровнями сетки в пунктах текущего инструмента |
Поиск по коду файла
#include <stdlib.mqh>
#include <stderror.mqh>
extern double grid = 20;
double gridstep = 6;
double multk[25] = {1,1,1,2,3,4,5};
int limit = 5;
double lotseq[25] = {1,1,2.8,6,6,12,28.8};
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;
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 = 1;
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 = 1*lotseq[tstep];
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;}
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)
{
if (bs != 0)
{
temp = OpenOrder (OP_BUYSTOP, bs, currentprice+stepseq[step+1]+spred, currentprice+stepseq[step+1]+spred-400*Point, currentprice+stepseq[step+1]+stepseq[step+2], "", magic, Green);
if (!temp) {rez = false;}
}
if (sl != 0)
{
temp = OpenOrder (OP_SELLLIMIT, sl, currentprice+stepseq[step+1], currentprice+stepseq[step+1]+400*Point, currentprice+spred, "", magic, Green);
if (!temp) {rez = false;}
}
if (ss != 0)
{
temp = OpenOrder (OP_SELLSTOP, ss, currentprice-stepseq[step], currentprice-stepseq[step]+400*Point, currentprice-stepseq[step]-stepseq[1]+spred, "", magic, Green);
if (!temp) {rez = false;}
}
if (ss != 0)
{
temp = OpenOrder (OP_BUYLIMIT, bl, currentprice-stepseq[step]+spred, currentprice-stepseq[step]+spred-400*Point, currentprice-stepseq[step]+stepseq[1], "", magic, Green);
if (!temp) {rez = false;}
}
return(rez);
}
if (statecur==1)
{
if (bs != 0)
{
temp = OpenOrder (OP_BUYSTOP, bs, currentprice+stepseq[sПоказано первые 50% кода (символов: 7866)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.