Создание советника - страница 2

 

//+------------------------------------------------------------------+
//| ParabolicM5_V2.mq4 |
//| Scriptong |
//| |
//+------------------------------------------------------------------+
#property copyright "Scriptong"
#property link "http://fortrader.ru"

//---- input parameters
extern double ParabolicStep=0.02; // Шаг Параболика
extern double ParabolicMax=0.2; // Максимум Параболика

extern double Lots = 0.1;

extern int MagicNumber=382;

bool FreeMarginAlert = False;
double MinLot, LotStep, MaxLot, Tick;
int LastTicket = 0, StopLevel, Spread;
datetime LastBar = 0;

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
MinLot = MarketInfo(Symbol(), MODE_MINLOT);
MaxLot = MarketInfo(Symbol(), MODE_MAXLOT);
LotStep = MarketInfo(Symbol(), MODE_LOTSTEP);
StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);
Spread = MarketInfo(Symbol(), MODE_SPREAD);
Tick = MarketInfo(Symbol(), MODE_TICKSIZE);
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}

//+------------------------------------------------------------------+
//| Открытие позиции |
//| Возвращает: |
//| True - Позиция открыта успешно |
//| False - Ошибка открытия |
//+------------------------------------------------------------------+
bool OpenOrder(int Type, double Price, double SL, double TP)
{
// Блок проверки достаточности свободных средств
if(AccountFreeMarginCheck(Symbol(), OP_BUY, Lots) <= 0 || GetLastError() == 134)
{
if(!FreeMarginAlert)
{
Print("Недостаточно средств для открытия позиции. Free Margin = ", AccountFreeMargin());
FreeMarginAlert = True;
}
return;
}
FreeMarginAlert = False;
// ---------------------------------------------

if(Type == OP_BUY)
string S = "BUY";
else
S = "SELL";
int ticket=OrderSend(Symbol(), Type, Lots, Price, 3, SL, TP, NULL, MagicNumber, 0, CLR_NONE);
if(ticket<0)
{
Print("Ошибка открытия позиции ", S, ": ",GetLastError());
return(False);
}
else
LastTicket = ticket;
return(True);
}

//+------------------------------------------------------------------+
//| Поиск своей позиции и закрытие, если она существует |
//| Возвращает: |
//| True - можно открывать противоположную (своих поз нет) |
//| False - нельзя открывать противоположную (не закрыта |
//| указанная или существует противоположная) |
//+------------------------------------------------------------------+
bool CloseIfExists(int Type)
{
if(OrderSelect(LastTicket, SELECT_BY_TICKET) && OrderCloseTime() == 0)
{
if(OrderType() == Type)
{
if(Type == OP_BUY)
double Price = Bid;
else
Price = Ask;
OrderClose(OrderTicket(), OrderLots(), Price, 10);
}
return(False);
}
return(True);
}

//+------------------------------------------------------------------+
//| Приведение значений к точности одного тика |
//+------------------------------------------------------------------+
double ND(double A)
{
return(MathRound(A/Tick)*Tick);
}

//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----

if(LastBar == Time[0])
return(0);

double SAR0 = iSAR(Symbol(), 0, ParabolicStep, ParabolicMax, 1);
double SAR1 = iSAR(Symbol(), 0, ParabolicStep, ParabolicMax, 2);

// **************************************** Открытие позиций **************************************
// Сигнал Buy
if(SAR0 < Close[1] && SAR1 > Close[2])
{
if(CloseIfExists(OP_SELL))
if((OrderSelect(LastTicket, SELECT_BY_TICKET) && OrderType() == OP_SELL) || LastTicket == 0)
{
RefreshRates();
double SL = ND(SAR0 - Tick);
if(ND(Bid-SL-StopLevel*Tick) > 0)
if(OpenOrder(OP_BUY, Ask, SL, 0))
LastBar = Time[0];
return(0);
}
}
else
// Сигнал Sell
if(SAR0 > Close[1] && SAR1 < Close[2])
{
if(CloseIfExists(OP_BUY))
if((OrderSelect(LastTicket, SELECT_BY_TICKET) && OrderType() == OP_BUY) || LastTicket == 0)
{
RefreshRates();
SL = ND(SAR0 + Spread*Tick + Tick);
if(ND(SL-Ask-StopLevel*Tick) > 0)
if(OpenOrder(OP_SELL, Bid, SL, 0))
LastBar = Time[0];
return(0);
}
}
else
// Подтяжка стопов
if(OrderSelect(LastTicket, SELECT_BY_TICKET) && OrderCloseTime() == 0)
{
if(OrderType() == OP_BUY && ND(SAR1-Tick) > ND(OrderStopLoss()))
if(ND(Bid-SAR1-StopLevel*Tick) > 0)
if(OrderModify(OrderTicket(), 0, SAR1-Tick, OrderTakeProfit(), 0))
LastBar = Time[0];
if(OrderType() == OP_SELL && ND(SAR1+Spread*Tick+Tick) < ND(OrderStopLoss()))
if(ND(SAR1+Spread*Tick+Tick-Ask-StopLevel*Tick) > 0)
if(OrderModify(OrderTicket(), 0, SAR1+Spread*Tick+Tick, OrderTakeProfit(), 0))
LastBar = Time[0];
}


// ************************************************************************************************
//----
return(0);
}
//+------------------------------------------------------------------+

 

Ну во первых эксперт не компиллируется.

'\end_of_program' - ending bracket '}' expected C:\Program Files\MetaTrader Finam\experts\ExpParabollic_Revers.mq4 (175, 

А искать ошибку в коде, - явно не то занятие в вых. день.

Скорее всего, вы что-то напутали при копировании.

Во вторых. В эксперте присутствует трал. 

else 
// Подтяжка стопов
if(OrderSelect(LastTicket, SELECT_BY_TICKET) && OrderCloseTime() == 0)
{
.. ... ...
if(OrderModify(OrderTicket(), 0, SAR1-Tick, OrderTakeProfit(), 0))

что совершенно меняет дело! Вы однозначно при этом не получите зеркального отражения сделок!

Однозначно! 

 
rid >>:

Ну во первых эксперт не компиллируется.

'\end_of_program' - ending bracket '}' expected C:\Program Files\MetaTrader Finam\experts\ExpParabollic_Revers.mq4 (175,

А искать ошибку в коде, - явно не то занятие в вых. день.

Скорее всего, вы что-то напутали при копировании.

Во вторых. В эксперте присутствует трал.

что совершенно меняет дело! Вы однозначно при этом не получите зеркального отражения сделок!

Однозначно!



Странно, я попробывал скопировать, выложенный мною, исходный код себе в C:\Program Files\MetaTrader 4\experts и он компилируется и работает. А что это такое - ExpParabollic_Revers.mq4? У нас речь шла о Parabolic_V1.mq4

 

Может легче написать новый эксперт, чем этот переделывать.

По следующему сценарию: с каждым перемещением индикатора Parabolic SAR должен подтягиваться Buy Limit или Sell Limit и Take Profit для предыдущего ордера.

Это теоритически возможно?

 

Скомпеллировался эксперт.

 ExpParabollic_Revers - это я начал было делать переворотную версию. А потом увидел трал и перестал.

//---------------------------------------------------------------------

Да, конечно. И теоретич. и практически.

Трал профита есть в свободном доступе. 

Трал лимит. ордеров тож нетрудно организовать.

 
Трал лимит ордеров на основе Parabolic SAR. Было бы интересно посмотреть его в работе.
 

Я начинающий программист на MQL4/

Прошу по силе и возможности помочь мне разобраться в нюансах синтаксиса MQL4 или увидеть ошибку в написании определенного эксперта. Дело в том, что приклепленный к данному сообщению разрабатываемый мною эксперт точно по алгоритау выполнят действия 1, 2 и 3, а вот действия 4 и 5 не выполняет. Уже целую неделю потратил на проработку различного рода комбинации с кодом, прочитал уйму литературы, а так и не смог добиться, чтобы функции и операторы в пп. 4 и 5 заработали. Прошу пожа-а-а-луйста помочь не потерять надежду на успех, а то "чайник" уже "кипит", а результата нет, просто руки опускаются от безисходности. Заранее премного благодарен!!!!

//+------------------------------------------------------------------+
//|                                                        Robot.mq4 |
//+------------------------------------------------------------------+

//-------------------------------------------------------------------+
extern double StopLoss   =17;     //SL ордера
extern double TakeProfit =15;     //TP ордера
extern double Lots        =0.01;     //стоимость ордера
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()                                                                                                                   //Открытие функции int start() 
  {
  int total=OrdersTotal();                                                                                                    //Определение переменной количества открытых ордеров
  if(total<1)                                                                                                                 //Условие: отсутствуют отложенные и открытые ордера
  {
   int order1=OrderSend(Symbol(), OP_SELLLIMIT, Lots, Ask+10*Point,3, Ask+(StopLoss+10)*Point, Ask-(TakeProfit-10)*Point);    //Открытие ордера order1: SELLLIMIT

   int order2=OrderSend(Symbol(), OP_BUYLIMIT, Lots, Ask-10*Point,3, Ask-(StopLoss+10)*Point, Ask+(TakeProfit-10)*Point);     //Открытие ордера order2: BUYLIMIT


//-------------------------------------------------------------------  1
  
   OrderSelect(order1, SELECT_BY_TICKET, MODE_TRADES);                                                                        //вызывается ордер1
   double cena1=OrderOpenPrice();                                                                                             //Определяется цена открытия ордера1
   int order3=OrderSend(Symbol(), OP_BUYSTOP, Lots, cena1+5*Point,3, cena1+(5-StopLoss)*Point, cena1+(5+TakeProfit)*Point);   //Открытие ордера order3: BUYSTOP

  
//-------------------------------------------------------------------  2
  
   OrderSelect(order2, SELECT_BY_TICKET, MODE_TRADES);                                                                         //Вызывается ордер2
   double cena2=OrderOpenPrice();                                                                                              //Определяется цена открытия ордера2
   int order4=OrderSend(Symbol(), OP_SELLSTOP, Lots, cena2-5*Point,3, cena2+(StopLoss-5)*Point, cena2-(TakeProfit+5)*Point);   //Открытие ордера order4: SELLSTOP


  return(0);                                                                                                                   //Прекращение исполнения 1-ой функции
  }
//-------------------------------------------------------------------  3
  
  OrderSelect(order2, SELECT_BY_TICKET, MODE_TRADES);                                                                          //Вызывается ордер2
  double cena3=OrderOpenPrice();                                                                                               //Определяется цена открытия ордера2
  if(Ask<cena3+5*Point)                                                                                                        //Условие: Ask меньше чем цена открытия ордера2 плюс 5 пунктов
  {
   OrderModify(order1, cena3+TakeProfit*Point, cena3+(TakeProfit+StopLoss)*Point, cena3, 0);                                   //Модификация ордера1 относительно цены открытия ордера2
  
  return(0);                                                                                                                   //Прекращение исполнения 2-ой функции
  }
//-------------------------------------------------------------------  4
  
   OrderSelect(order1, SELECT_BY_TICKET, MODE_TRADES);                                                                         //Вызывается ордер1
   double cena4=OrderOpenPrice();                                                                                              //Определяется цена открытия ордера1
   if(Ask>cena4-5*Point)                                                                                                       //Условие: Ask ,больше чем цена открытия ордера1 минус 5 пунктов
  {
   OrderModify(order2, cena4-TakeProfit*Point, cena4-(TakeProfit+StopLoss)*Point, cena4, 0);                                   //Модификация ордера2 относительно цены открытия ордера1

  return(0);                                                                                                                   //Прекращение исполнения 3-ей функции
  }
//-------------------------------------------------------------------  5
  return(0);                                                                                                                   //Закрытие функции int start()
  }
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  { return(0); }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  { return(0); }
Причина обращения: