pioner_v7.mq4
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «pioner_v7.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Pioner — это торговый советник для MetaTrader 4, написанный на языке MQL4. Программа реализует многоэтапную торговую логику с использованием конечного автомата, который переключается между несколькими состояниями в зависимости от текущей структуры открытых и отложенных ордеров на счёте.
Советник размещает ордера различных типов — рыночные Buy и Sell, а также отложенные BuyStop, SellStop, BuyLimit и SellLimit — с заданными уровнями стоп-лосса и тейк-профита. Лот может фиксироваться вручную или рассчитываться автоматически на основе остатка средств. Состояние торговой сессии сохраняется в глобальных переменных терминала, что позволяет восстанавливать позицию при перезапуске советника.
Программа поддерживает принудительное закрытие всех позиций, паузу между операциями и вывод информационных данных на график. При запуске отображается диалоговое окно с запросом подтверждения, определяющее, сбрасывать ли состояние или продолжить работу с ранее сохранёнными данными.
Настройки программы
| Настройка | Описание |
|---|---|
| Lots | Размер лота — Числовой параметр, задающий начальный размер лота для открытия ордеров. |
| Grid | Шаг сетки — Целочисленный параметр, задающий расстояние между уровнями сетки в пунктах для размещения ордеров и стоп-лоссов. |
| StopLoss | Стоп-лосс — Целочисленный параметр, задающий расстояние до стоп-лосса в пунктах от цены открытия ордера. |
| FixedLot | Фиксированный лот — Переключатель, определяющий, используется ли фиксированный размер лота или автоматический расчёт на основе остатка средств. |
| Slippage | Допустимое проскальзывание — Целочисленный параметр, допустимое проскальзывание цены в пунктах при выполнении ордеров. |
| Magic | Магическое число — Целочисленный идентификатор магического числа, используемый для фильтрации ордеров, управляемых данным советником. |
| StopOnRoll | Стоп при нарастании — Переключатель, при активации которого советник закрывает все позиции и переходит в начальное состояние при достижении определённых условий нарастания. |
| StopAll | Остановить всё — Переключатель, при активации которого советник немедленно закрывает все управляемые ордера и сбрасывает состояние. |
| MySleep | Пауза между операциями — Целочисленный параметр, задающий время ожидания в миллисекундах между последовательными торговыми операциями. |
Поиск по коду файла
#include <stdlib.mqh>
#include <WinUser32.mqh>
string vers = "6.0";
extern double Lots = 0.3;
extern int Grid = 9;
extern int StopLoss = 200;
extern bool FixedLot = true;
extern int Slippage = 3;
extern int Magic = 110705;
extern bool StopOnRoll = false;
extern bool StopAll = false;
extern int MySleep = 3000;
int BuyCnt = 0;
int SellCnt = 0;
int BuyLimitCnt = 0;
int SellLimitCnt = 0;
int BuyStopCnt = 0;
int SellStopCnt = 0;
int Step = 0;
double lotseq[5] = {1,1,3.5,8.3,20.7};
#define DIRECT 1
#define REVERSE 2
#define STATE_0 0
#define STEP_1 1
#define STEP_UP 2
#define STEP_DOWN 3
#define ROLL_UP 4
#define ROLL_DOWN 5
string gPrefix = "Pioner_";
int PrevState = STATE_0;
int init() {
// код доступен только после оплаты
}
int deinit() {
return(0);
}
int start() {
// код доступен только после оплаты
}
int OnStep1() {
Print("Func: Step1");
Print("Step: ", Step);
Print("PrevState: ", State2Str(PrevState));
double spr = MarketInfo(Symbol(), MODE_SPREAD)*Point;
int ticket = Buy(LotsRisk(Lots), Ask, Ask-StopLoss*Point, Bid+Grid*Point, "*");
OrderSelect(ticket, SELECT_BY_TICKET);
double AskB = OrderOpenPrice();
double BidB = AskB - spr;
ticket = Sell(LotsRisk(Lots), Bid, Bid+StopLoss*Point, Ask-Grid*Point, "*");
OrderSelect(ticket, SELECT_BY_TICKET);
double BidS = OrderOpenPrice();
double AskS = BidS + spr;
SetBuyStop(LotsRisk(Lots), AskB+Grid*Point, AskB+Grid*Point-StopLoss*Point, BidB+2*Grid*Point, "");
SetSellLimit(LotsRisk(Lots), BidB+Grid*Point, BidB+Grid*Point+StopLoss*Point, AskB, "");
SetSellStop(LotsRisk(Lots), BidS-Grid*Point, BidS-Grid*Point+StopLoss*Point, AskS-2*Grid*Point, "");
SetBuyLimit(LotsRisk(Lots), AskS-Grid*Point, AskS-Grid*Point-StopLoss*Point, BidS, "");
PrevState = STEP_1;
SetGlobals();
return(0);
}
int OnStepUp() {
Print("Func: StepUp");
Print("Step: ", Step);
Print("PrevState: ", State2Str(PrevState));
int ticket = GetOrder(OP_SELL, 1, REVERSE, MODE_TRADES);
double Bid0 = OrderOpenPrice();
double Ask0 = Bid0 + MarketInfo(Symbol(), MODE_SPREAD)*Point;
double TP = OrderTakeProfit();
SetBuyStop(LotsRisk(Lots), Ask0+Grid*Point, Ask0+Grid*Point-StopLoss*Point, Bid0+2*Grid*Point, "");
SetSellLimit(lotseq[Step]*LotsRisk(Lots), Bid0+Grid*Point, Bid0+Grid*Point+StopLoss*Point, Ask0, "");
SetSellStop(LotsRisk(Lots), Bid0-Grid*Point, Bid0-Grid*Point+StopLoss*Point, Ask0-2*Grid*Point, "");
SetBuyLimit(LotsRisk(Lots), Ask0-Grid*Point, Ask0-Grid*Point-StopLoss*Point, Bid0, "");
int cnt = OrdersTotal();
for (int i=0; i < cnt; i++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != Magic) continue;
if (OrderType() != OP_SELL) continue;
if (OrderTicket() == ticket) continue;
ModifyOrder(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), TP);
}
ticket = GetOrder(OP_SELLSTOP, 1, DIRECT, MODE_TRADES);
if (ticket != -1) DeleteOrder(ticket);
ticket = GetOrder(OP_BUYLIMIT, 1, DIRECT, MODE_TRADES);
if (ticket != -1) DeleteOrder(ticket);
PrevState = STEP_UP;
SetGlobals();
return(0);
}
int OnStepDown() {
Print("Func: StepDown");
Print("Step: ", Step);
Print("PrevState: ", State2Str(PrevState));
int ticket = GetOrder(OP_BUY, 1, REVERSE, MODE_TRADES);
double Ask0 = OrderOpenPrice();
double Bid0 = Ask0 - MarketInfo(Symbol(), MODE_SPREAD)*Point;
double TP = OrderTakeProfit();
SetSellStop(LotsRisk(Lots), Bid0-Grid*Point, Bid0-Grid*Point+StopLoss*Point, Ask0-2*Grid*Point, "");
SetBuyLimit(lotseq[-Step]*LotsRisk(Lots), Ask0-Grid*Point, Ask0-Grid*Point-StopLoss*Point, Bid0, "");
SetBuyStop(LotsRisk(Lots), Ask0+Grid*Point, Ask0+Grid*Point-StopLoss*Point, Bid0+2*Grid*Point, "");
SetSellLimit(LotsRisk(Lots), Bid0+Grid*Point, Bid0+Grid*Point+StopLoss*Point, Ask0, "");
int cnt = OrdersTotal();
for (int i=0; i < cnt; i++) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != Magic) continue;
if (OrderType() != OP_BUY) continue;
if (OrderTicket() == ticket) continue;
ModifyOrder(OrderTicket(), OrderOpenPrice(), OrderStopLoss(), TP);
}
ticket = GetOrder(OP_BUYSTOP, 1, DIRECT, MODE_TRADES);
if (ticket != -1) DeleteOrder(ticket);
ticket = GetOrder(OP_SELLLIMIT, 1, DIRECT, MODE_TRADES);
if (ticket != -1) DeleteOrder(ticket);
PrevState = STEP_DOWN;
SetGlobals();
return(0);
}
int OnRollUp() {
Print("Func: RollUp");
Print("Step: ", Step);
Print("PrevState: ", State2Str(PrevState));
if (StopOnRoll) {
CloseAll();
PrevState = STATE_0;
SetGlobals();
return(0);
}
PrevState = ROLL_UP;
SetGlobals();
OnStepUp();
return(0);
}
int OnRollDown() {
Print("Func: RollDown");
Print("Step: ", Step);
Print("PrevState: ", State2Str(PrevState));
if (StopOnRoll) {
CloseAll();
PrevState = STATE_0;
SetGlobals();
return(0);
}
PrevState = ROLL_DOWN;
SetGlobals();
OnStepDown();
return(0);
}
int GetOrder(int type, int pos=1, int order=DIRECT, int mode=MODE_TRADES) {
return (GetOrderEx(type, 0, pos, order, mode));
}
int GetOrderEx(int type, double lot, int pos=1, int order=DIRECT, int mode=MODE_TRADES) {
return (GetOrderExT(type, lot, pos, order, mode));
switch (order) {
case DIRECT:
case REVERSE:
break;
default:
return(-1);
}
switch (mode) {
case MODE_TRADES:
int cnt = OrdersTotal();
break;
case MODE_HISTORY:
cnt = HistoryTotal();
break;
default:
return(-1);
}
int ind = 1;
if (order == DIRECT) {
for (int i=0; i < cnt; i++) {
OrderSelect(i, SELECT_BY_POS, mode);
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != Magic) continue;
if (OrderType() != type) continue;
if (lot > 0 && DoubleToStr(OrderLots(), 1) != DoubleToStr(lot, 1)) continue;
if (ind == pos) return(OrderTicket());
ind++;
}
}
if (order == REVERSE) {
for (i=cnt-1; i >= 0; i--) {
OrderSelect(i, SELECT_BY_POS, mode);
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != Magic) continue;
if (OrderType() != type) continue;
if (lot > 0 && DoubleToStr(OrderLots(), 1) != DoubleToStr(lot, 1)) continue;
if (ind == pos) return(OrderTicket());
ind++;
}
}
return(-1);
}
int GetOrderExT(int type, double lot, int pos=1, int order=DIRECT, int mode=MODE_TRADES) {
switch (order) {
case DIRECT:
case REVERSE:
break;
default:
return(-1);
}
switch (mode) {
case MODE_TRADES:
int cnt = OrdersTotal();
break;
case MODE_HISTORY:
cnt = HistoryTotal();
break;
default:
return(-1);
}
int Tickets[];
ArrayResize(Tickets, cnt);
for (int i=0; i < cnt; i++) {
OrderSelect(i, SELECT_BY_POS, mode);
Tickets[i] = OrderTicket();
}
for (i=0; i < cnt; i++) {
for (int j=i+1; j < cnt; j++) {
OrderSelect(Tickets[i], SELECT_BY_TICKET, mode);
int dt1 = OrderCloseTime();
OrderSelect(Tickets[j], SELECT_BY_TICKET, mode);
int dt2 = OrderCloseTime();
if (mode == MODE_TRADES) {
if (Tickets[i] > Tickets[j]) {
int tmp = Tickets[i];
Tickets[i] = Tickets[j];
Tickets[j] = tmp;
}
}
if (mode == MODE_HISTORY) {
if (dt1 > dt2) {
tmp = Tickets[i];
Tickets[i] = Tickets[j];
Tickets[j] = tmp;
}
}
}
}
int ind = 1;
if (order == DIRECT) {
for (i=0; i < cnt; i++) {
OrderSelect(Tickets[i], SELECT_BY_TICKET, mode);
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != Magic) continue;
if (OrderType() != type) continue;
if (lot > 0 && DoubleToStr(OrderLots(), 1) != DoubleToStr(lot, 1)) continue;
if (ind == pos) return(OrderTicket());
ind++;
}
}
if (order == REVERSE) {
for (i=cnt-1; i >= 0; i--) {
OrderSelect(Tickets[i], SELECT_BY_TICKET, mode);
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != Magic) contiПоказано первые 50% кода (символов: 16734)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.