Всем привет.
Андрей делать ничего не надо, или только из спортивного интереса.
Ну или по просьбе.
И ТАК.
советник мт4.
но с ошибками прототип.
/+------------------------------------------------------------------+
//| DualParabolicSAR.mq4 |
//| Copyright 2023, MetaQuotes Software Corp. |
//|
www.mql5.com |
//+------------------------------------------------------------------+
#property copyright «Copyright 2023, MetaQuotes Software Corp.»
#property link «
www.mql5.com»
#property version «1.00»
#property strict
// Настройки индикаторов
input double SAR_Step1 = 0.02; // Шаг SAR 1
input double SAR_Max1 = 0.2; // Максимум SAR 1
input double SAR_Step2 = 0.03; // Шаг SAR 2
input double SAR_Max2 = 0.3; // Максимум SAR 2
// Настройки лота и переворотов
input double InitialLot = 0.1; // Стартовый лот
input double LotMultiplier = 2.0; // Множитель лота
input int MaxReversals = 5; // Макс. переворотов подряд
// Настройки стоп-лосс/тейк-профит
input int StopLoss = 200; // Стоп-лосс (пункты)
input int TakeProfit = 200; // Тейк-профит (пункты)
// Настройки трейлинг-стопа
input bool UseTrailing = true; // Включить трейлинг
input int TrailStart = 100; // Старт трейлинга (пункты)
input int TrailStep = 50; // Шаг трейлинга (пункты)
// Системные переменные
int reversalCount = 0;
double currentLot = InitialLot;
double signalLevel = 0.0;
int signalDirection = 0; // 1=buy, -1=sell, 0=нет сигнала
string levelName = «SignalLevel»;
datetime lastTradeTime = 0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit() {
ObjectCreate(0, levelName, OBJ_HLINE, 0, 0, 0);
ObjectSetInteger(0, levelName, OBJPROP_COLOR, clrRed);
ObjectSetInteger(0, levelName, OBJPROP_STYLE, STYLE_DASH);
ObjectSetInteger(0, levelName, OBJPROP_BACK, true);
ObjectSetInteger(0, levelName, OBJPROP_SELECTABLE, false);
ObjectSetInteger(0, levelName, OBJPROP_HIDDEN, true);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
ObjectDelete(levelName);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick() {
// Проверяем новый бар
static datetime lastBar;
datetime currentBar = iTime(_Symbol, PERIOD_CURRENT, 0);
if(lastBar == currentBar) return;
lastBar = currentBar;
// Получаем значения индикаторов
double sar1 = iSAR(_Symbol, 0, SAR_Step1, SAR_Max1, 1);
double sar2 = iSAR(_Symbol, 0, SAR_Step2, SAR_Max2, 1);
double close = iClose(_Symbol, 0, 1);
// Определяем сигналы
int dir1 = (close > sar1)? 1: -1;
int dir2 = (close > sar2)? 1: -1;
// Обработка сигналов
if(dir1 == dir2) {
// Одинаковые сигналы
signalDirection = dir1;
signalLevel = 0;
reversalCount = 0;
currentLot = InitialLot;
ObjectSetInteger(0, levelName, OBJPROP_TIMEFRAMES, OBJ_NO_PERIODS);
} else {
// Противоположные сигналы
if(signalLevel == 0) {
signalLevel = close;
ObjectSetDouble(0, levelName, OBJPROP_PRICE, signalLevel);
ObjectSetInteger(0, levelName, OBJPROP_TIMEFRAMES, OBJ_ALL_PERIODS);
}
signalDirection = 0;
}
// Проверка позиций
bool hasPosition = false;
for(int i = OrdersTotal()-1; i >= 0; i--) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) &&
OrderSymbol() == _Symbol &&
OrderMagicNumber() == Magic) {
hasPosition = true;
ManageOpenPosition();
break;
}
}
// Открытие новой позиции
if(!hasPosition && signalDirection != 0 && lastTradeTime != Time[0]) {
OpenPosition();
lastTradeTime = Time[0];
}
// Переворот при достижении уровня
if(!hasPosition && signalLevel > 0 && MathAbs(Close[0] — signalLevel) < Point) {
reversalCount++;
if(reversalCount <= MaxReversals) {
currentLot = NormalizeDouble(InitialLot * MathPow(LotMultiplier, reversalCount-1), 2);
signalDirection = (Close[0] > signalLevel)? 1: -1;
OpenPosition();
lastTradeTime = Time[0];
}
}
}
//+------------------------------------------------------------------+
//| Управление открытой позицией |
//+------------------------------------------------------------------+
void ManageOpenPosition() {
if(UseTrailing) ApplyTrailingStop();
}
//+------------------------------------------------------------------+
//| Применение трейлинг-стопа |
//+------------------------------------------------------------------+
void ApplyTrailingStop() {
for(int i = OrdersTotal()-1; i >= 0; i--) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) &&
OrderSymbol() == _Symbol &&
OrderMagicNumber() == Magic) {
int orderType = OrderType();
double newStop = 0;
double point = MarketInfo(_Symbol, MODE_POINT);
if(orderType == OP_BUY) {
if(Bid — OrderOpenPrice() > TrailStart * point) {
newStop = Bid — TrailStep * point;
if(newStop > OrderStopLoss() || OrderStopLoss() == 0) {
OrderModify(OrderTicket(), OrderOpenPrice(), newStop, OrderTakeProfit(), 0, clrNONE);
}
}
}
else if(orderType == OP_SELL) {
if(OrderOpenPrice() — Ask > TrailStart * point) {
newStop = Ask + TrailStep * point;
if(newStop < OrderStopLoss() || OrderStopLoss() == 0) {
OrderModify(OrderTicket(), OrderOpenPrice(), newStop, OrderTakeProfit(), 0, clrNONE);
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| Открытие позиции |
//+------------------------------------------------------------------+
void OpenPosition() {
int ticket = -1;
double sl = 0, tp = 0;
double point = MarketInfo(_Symbol, MODE_POINT);
if(signalDirection == 1) { // Buy
sl = (StopLoss > 0)? Ask — StopLoss * point: 0;
tp = (TakeProfit > 0)? Ask + TakeProfit * point: 0;
ticket = OrderSend(_Symbol, OP_BUY, currentLot, Ask, 3, sl, tp, «DualSAR», Magic, 0, clrBlue);
}
else if(signalDirection == -1) { // Sell
sl = (StopLoss > 0)? Bid + StopLoss * point: 0;
tp = (TakeProfit > 0)? Bid — TakeProfit * point: 0;
ticket = OrderSend(_Symbol, OP_SELL, currentLot, Bid, 3, sl, tp, «DualSAR», Magic, 0, clrRed);
}
if(ticket > 0) {
Print(«Position opened: », signalDirection > 0? «BUY»: «SELL», " Lot: ", currentLot);
}
}
//+------------------------------------------------------------------+
//| Возвращает уникальный Magic number |
//+------------------------------------------------------------------+
int Magic {
get { return 20230531; } // Уникальный идентификатор
}
это начало было
ААААААААААААААААААААААААААААААААААААА
ВОТ
САМ ИСПРАВЛЕНЫЙ СОВЕТНИК
//+------------------------------------------------------------------+
//| DualParabolicSAR.mq4 |
//| Copyright 2023, MetaQuotes Software Corp. |
//|
www.mql5.com |
//+------------------------------------------------------------------+
#property copyright «Copyright 2023, MetaQuotes Software Corp.»
#property link «
www.mql5.com»
#property version «1.01»
#property strict
// Настройки индикаторов
input double SAR_Step1 = 0.02; // Шаг SAR 1
input double SAR_Max1 = 0.2; // Максимум SAR 1
input double SAR_Step2 = 0.03; // Шаг SAR 2
input double SAR_Max2 = 0.3; // Максимум SAR 2
// Настройки лота и переворотов
input double InitialLot = 0.1; // Стартовый лот
input double LotMultiplier = 2.0; // Множитель лота
input int MaxReversals = 5; // Макс. переворотов подряд
// Настройки стоп-лосс/тейк-профит
input int StopLoss = 200; // Стоп-лосс (пункты)
input int TakeProfit = 200; // Тейк-профит (пункты)
// Настройки трейлинг-стопа
input bool UseTrailing = true; // Включить трейлинг
input int TrailStart = 100; // Старт трейлинга (пункты)
input int TrailStep = 50; // Шаг трейлинга (пункты)
input int MagicNumber = 12345; // Уникальный идентификатор
// Системные переменные
int reversalCount = 0;
double currentLot = InitialLot;
double signalLevel = 0.0;
int signalDirection = 0; // 1=buy, -1=sell, 0=нет сигнала
string levelName = «SignalLevel»;
datetime lastTradeTime = 0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit() {
ObjectCreate(0, levelName, OBJ_HLINE, 0, 0, 0);
ObjectSetInteger(0, levelName, OBJPROP_COLOR, clrRed);
ObjectSetInteger(0, levelName, OBJPROP_STYLE, STYLE_DASH);
ObjectSetInteger(0, levelName, OBJPROP_BACK, true);
ObjectSetInteger(0, levelName, OBJPROP_SELECTABLE, false);
ObjectSetInteger(0, levelName, OBJPROP_HIDDEN, true);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
ObjectDelete(0, levelName);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick() {
// Проверяем новый бар
static datetime lastBar;
datetime currentBar = iTime(_Symbol, PERIOD_CURRENT, 0);
if(lastBar == currentBar) return;
lastBar = currentBar;
// Получаем значения индикаторов
double sar1 = iSAR(_Symbol, 0, SAR_Step1, SAR_Max1, 1);
double sar2 = iSAR(_Symbol, 0, SAR_Step2, SAR_Max2, 1);
double close = iClose(_Symbol, PERIOD_CURRENT, 1);
// Определяем сигналы
int dir1 = (close > sar1)? 1: -1;
int dir2 = (close > sar2)? 1: -1;
// Обработка сигналов
if(dir1 == dir2) {
// Одинаковые сигналы
signalDirection = dir1;
signalLevel = 0;
reversalCount = 0;
currentLot = InitialLot;
ObjectSetInteger(0, levelName, OBJPROP_TIMEFRAMES, OBJ_NO_PERIODS);
} else {
// Противоположные сигналы
if(signalLevel == 0) {
signalLevel = close;
ObjectSetDouble(0, levelName, OBJPROP_PRICE, signalLevel);
ObjectSetInteger(0, levelName, OBJPROP_TIMEFRAMES, OBJ_ALL_PERIODS);
}
signalDirection = 0;
}
// Проверка позиций
bool hasPosition = false;
for(int i = OrdersTotal()-1; i >= 0; i--) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) &&
OrderSymbol() == _Symbol &&
OrderMagicNumber() == MagicNumber) {
hasPosition = true;
ManageOpenPosition();
break;
}
}
// Открытие новой позиции по сигналу
if(!hasPosition && signalDirection != 0) {
if(OpenPosition()) {
lastTradeTime = TimeCurrent();
}
}
// Переворот при достижении уровня
if(!hasPosition && signalLevel > 0) {
double distance = MathAbs(Close[0] — signalLevel);
double point = MarketInfo(_Symbol, MODE_POINT);
if(distance < 10*point) {
reversalCount++;
if(reversalCount <= MaxReversals) {
currentLot = NormalizeDouble(InitialLot * MathPow(LotMultiplier, reversalCount-1), 2);
signalDirection = (Close[0] > signalLevel)? 1: -1;
if(OpenPosition()) {
lastTradeTime = TimeCurrent();
}
}
}
}
}
//+------------------------------------------------------------------+
//| Управление открытой позицией |
//+------------------------------------------------------------------+
void ManageOpenPosition() {
if(UseTrailing) ApplyTrailingStop();
}
//+------------------------------------------------------------------+
//| Применение трейлинг-стопа |
//+------------------------------------------------------------------+
void ApplyTrailingStop() {
for(int i = OrdersTotal()-1; i >= 0; i--) {
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) &&
OrderSymbol() == _Symbol &&
OrderMagicNumber() == MagicNumber) {
int orderType = OrderType();
double newStop = 0;
double point = MarketInfo(_Symbol, MODE_POINT);
double bid = MarketInfo(_Symbol, MODE_BID);
double ask = MarketInfo(_Symbol, MODE_ASK);
if(orderType == OP_BUY) {
if(bid — OrderOpenPrice() > TrailStart * point) {
newStop = NormalizeDouble(bid — TrailStep * point, Digits);
if(newStop > OrderStopLoss() || OrderStopLoss() == 0) {
OrderModify(OrderTicket(), OrderOpenPrice(), newStop, OrderTakeProfit(), 0, clrNONE);
}
}
}
else if(orderType == OP_SELL) {
if(OrderOpenPrice() — ask > TrailStart * point) {
newStop = NormalizeDouble(ask + TrailStep * point, Digits);
if(newStop < OrderStopLoss() || OrderStopLoss() == 0) {
OrderModify(OrderTicket(), OrderOpenPrice(), newStop, OrderTakeProfit(), 0, clrNONE);
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| Открытие позиции |
//+------------------------------------------------------------------+
bool OpenPosition() {
int ticket = -1;
double sl = 0, tp = 0;
double point = MarketInfo(_Symbol, MODE_POINT);
double ask = MarketInfo(_Symbol, MODE_ASK);
double bid = MarketInfo(_Symbol, MODE_BID);
if(signalDirection == 1) { // Buy
sl = (StopLoss > 0)? NormalizeDouble(ask — StopLoss * point, Digits): 0;
tp = (TakeProfit > 0)? NormalizeDouble(ask + TakeProfit * point, Digits): 0;
ticket = OrderSend(_Symbol, OP_BUY, currentLot, ask, 3, sl, tp, «DualSAR», MagicNumber, 0, clrBlue);
}
else if(signalDirection == -1) { // Sell
sl = (StopLoss > 0)? NormalizeDouble(bid + StopLoss * point, Digits): 0;
tp = (TakeProfit > 0)? NormalizeDouble(bid — TakeProfit * point, Digits): 0;
ticket = OrderSend(_Symbol, OP_SELL, currentLot, bid, 3, sl, tp, «DualSAR», MagicNumber, 0, clrRed);
}
if(ticket > 0) {
Print(«Position opened: », (signalDirection>0?«BUY»:«SELL»), " Lot: ", currentLot);
return true;
}
else {
Print(«OrderSend error: », GetLastError());
return false;
}
}
всем спасибо жду комментариев.
Комментарии (3)
24 igrun Автор Сообщений: 1737 - igrun
24 igrun Автор Сообщений: 1737 - igrun
24 igrun Автор Сообщений: 1737 - igrun
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий