pioner_v4.mq4
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «pioner_v4.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Pioner — торговый советник для MetaTrader 4, использующий сеточную логику управления ордерами. Советник отслеживает количество открытых позиций и отложенных ордеров на символе, определяет текущее состояние системы и выполняет соответствующие действия: открытие новых ордеров, удаление или модификацию сеточных уровней.
Состояние хранится в глобальных переменных терминала, что позволяет сохранять его между перезапусками. При инициализации отображается диалоговое окно для сброса или восстановления предыдущего состояния. Советник поддерживает как фиксированный размер лота, так и расчёт на основе баланса счёта.
Встроены механизмы управления рисками: остановка при роуле (StopOnRoll) и полная остановка всех операций (StopAll). При остановке все открытые позиции закрываются, а отложенные ордера удаляются. Советник работает с ордерами типа OP_BUY, OP_SELL, OP_BUYLIMIT, OP_SELLLIMIT, OP_BUYSTOP и OP_SELLSTOP.
Настройки программы
| Настройка | Описание |
|---|---|
| Lots | Размер лота — Размер лота по умолчанию, используемый при фиксированном режиме (FixedLot = true). |
| Grid | Шаг сетки — Шаг сетки в пунктах, используемый для размещения отложенных ордеров (BuyLimit, SellLimit, BuyStop, SellStop) относительно текущей цены. |
| StopLoss | Стоп-лосс — Стоп-лосс в пунктах, задающий расстояние от цены открытия ордера до уровня защитного ордера. |
| FixedLot | Фиксированный лот — Переключатель фиксированного размера лота. При значении true используется заданный параметр Lots; при false — лот рассчитывается на основе баланса счёта. |
| Slippage | Проскальзывание — Допустимое проскальзывание цены при открытии и закрытии ордеров, указываемое в пунктах. |
| Magic | Магический номер — Магический номер ордера, используемый для идентификации ордеров, открытых данным советником, на символе. |
| StopOnRoll | Остановка при роуле — Переключатель остановки при роуле. При значении true при переходе в состояния ROLL_UP или ROLL_DOWN все позиции закрываются и состояние сбрасывается. |
| StopAll | Остановить всё — Переключатель полной остановки. При значении true советник закрывает все ордера, сбрасывает состояние и прекращает торговые операции до ручного сброса. |
Поиск по коду файла
#include <stdlib.mqh>
#include <WinUser32.mqh>
extern double Lots = 0.1;
extern int Grid = 15;
extern int StopLoss = 200;
extern bool FixedLot = true;
extern int Slippage = 3;
extern int Magic = 110705;
extern bool StopOnRoll = false;
extern bool StopAll = false;
int BuyCnt = 0;
int SellCnt = 0;
int BuyLimitCnt = 0;
int SellLimitCnt = 0;
int BuyStopCnt = 0;
int SellStopCnt = 0;
int Step = 0;
#define FIRST_ORDER 1
#define LAST_ORDER 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 gVarName = "Pioner_PrevState";
int PrevState = STATE_0;
int init() {
// код доступен только после оплаты
}
int deinit() {
return(0);
}
int start() {
// код доступен только после оплаты
}
int OnStep1() {
double spread = 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 - spread;
ticket = Sell(LotsRisk(Lots), Bid, Bid+StopLoss*Point, Ask-Grid*Point, "*");
OrderSelect(ticket, SELECT_BY_TICKET);
double BidS = OrderOpenPrice();
double AskS = BidS + spread;
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;
SetPrevState(PrevState);
return(0);
}
int OnStepUp() {
if (SellStopCnt == 1) {
int ticket = GetOrderT(OP_SELLSTOP);
DeleteOrder(ticket);
SellStopCnt--;
}
if (BuyLimitCnt == 1) {
ticket = GetOrderT(OP_BUYLIMIT);
DeleteOrder(ticket);
BuyLimitCnt--;
}
GetOrderT(OP_SELL, LAST_ORDER, MODE_TRADES);
double Bid0 = OrderOpenPrice();
double Ask0 = Bid0 + MarketInfo(Symbol(), MODE_SPREAD)*Point;
if (BuyStopCnt == 0) {
SetBuyStop(LotsRisk(Lots), Ask0+Grid*Point, Ask0+Grid*Point-StopLoss*Point, Bid0+2*Grid*Point, "");
}
if (SellLimitCnt == 0) {
SetSellLimit(MathPow(2, Abs(Step)-1)*LotsRisk(Lots), Bid0+Grid*Point, Bid0+Grid*Point+StopLoss*Point, Ask0, "");
}
if (SellStopCnt == 0) {
SetSellStop(LotsRisk(Lots), Bid0-Grid*Point, Bid0-Grid*Point+StopLoss*Point, Ask0-2*Grid*Point, "");
}
if (BuyLimitCnt == 0) {
SetBuyLimit(LotsRisk(Lots), Ask0-Grid*Point, Ask0-Grid*Point-StopLoss*Point, Bid0, "");
}
PrevState = STEP_UP;
SetPrevState(PrevState);
return(0);
}
int OnStepDown() {
if (BuyStopCnt == 1) {
int ticket = GetOrderT(OP_BUYSTOP);
DeleteOrder(ticket);
BuyStopCnt--;
}
if (SellLimitCnt == 1) {
ticket = GetOrderT(OP_SELLLIMIT);
DeleteOrder(ticket);
SellLimitCnt--;
}
ticket = GetOrderT(OP_SELL, LAST_ORDER, MODE_TRADES);
double Bid0 = OrderOpenPrice();
double Ask0 = Bid0 + MarketInfo(Symbol(), MODE_SPREAD)*Point;
if (BuyStopCnt == 0) {
SetBuyStop(LotsRisk(Lots), Ask0+Grid*Point, Ask0+Grid*Point-StopLoss*Point, Bid0+2*Grid*Point, "");
}
if (SellLimitCnt == 0) {
SetSellLimit(LotsRisk(Lots), Bid0+Grid*Point, Bid0+Grid*Point+StopLoss*Point, Ask0, "");
}
if (SellStopCnt == 0) {
SetSellStop(LotsRisk(Lots), Bid0-Grid*Point, Bid0-Grid*Point+StopLoss*Point, Ask0-2*Grid*Point, "");
}
if (BuyLimitCnt == 0) {
SetBuyLimit(MathPow(2, Abs(Step)-1)*LotsRisk(Lots), Ask0-Grid*Point, Ask0-Grid*Point-StopLoss*Point, Bid0, "");
}
PrevState = STEP_DOWN;
SetPrevState(PrevState);
return(0);
}
int OnRollUp() {
if (StopOnRoll) {
CloseAll();
PrevState = STATE_0;
SetPrevState(PrevState);
return(0);
}
if (SellStopCnt == 1) {
int ticket = GetOrderT(OP_SELLSTOP);
DeleteOrder(ticket);
SellStopCnt--;
}
if (BuyLimitCnt == 1) {
ticket = GetOrderT(OP_BUYLIMIT);
DeleteOrder(ticket);
BuyLimitCnt--;
}
ticket = GetOrderT(OP_BUY, LAST_ORDER, MODE_TRADES);
int cnt = OrdersTotal();
for (int i=cnt-1; i >= 0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != Magic) continue;
if (OrderType() != OP_BUY) continue;
if (ticket != OrderTicket()) CloseOrder(OrderTicket(), OrderLots(), Bid);
}
GetOrderT(OP_SELL, LAST_ORDER, MODE_TRADES);
double Bid0 = OrderOpenPrice() ;
double Ask0 = Bid0 + MarketInfo(Symbol(), MODE_SPREAD)*Point;
if (BuyStopCnt == 0) {
SetBuyStop(LotsRisk(Lots), Ask0+Grid*Point, Ask0+Grid*Point-StopLoss*Point, Bid0+2*Grid*Point, "");
}
if (SellLimitCnt == 0) {
SetSellLimit(MathPow(2, Abs(Step)-1)*LotsRisk(Lots), Bid0+Grid*Point, Bid0+Grid*Point+StopLoss*Point, Ask0, "");
}
if (SellStopCnt == 0) {
SetSellStop(LotsRisk(Lots), Bid0-Grid*Point, Bid0-Grid*Point+StopLoss*Point, Ask0-2*Grid*Point, "");
}
if (BuyLimitCnt == 0) {
SetBuyLimit(LotsRisk(Lots), Ask0-Grid*Point, Ask0-Grid*Point-StopLoss*Point, Bid0, "");
}
PrevState = ROLL_UP;
SetPrevState(PrevState);
return(0);
}
int OnRollDown() {
if (StopOnRoll) {
CloseAll();
PrevState = STATE_0;
SetPrevState(PrevState);
return(0);
}
if (BuyStopCnt == 1) {
int ticket = GetOrderT(OP_BUYSTOP);
DeleteOrder(ticket);
Показано первые 50% кода (символов: 13540)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.