Напишу советник бесплатно - страница 21

 
Vitalii Ananev:

Вы имеете ввиду, что бы открывал сделки в момент открытия свечи D1? Если так то задайте в логике работы советника условия открывать сделки только в заданное время. 

Понятно. и такой вопрос: я ставлю две отложки в +15 пунктов от цены байстоп и селстоп. И при каждом тике переставляю их по новой цене. Как только цена касается их при резком движении цены ( чаще всего при новостях)  терминал зависает. (Это все в тестере, в демо и реале не побывал) Почему он зависает ?
 
MIR_KAZAN:
Понятно. и такой вопрос: я ставлю две отложки в +15 пунктов от цены байстоп и селстоп. И при каждом тике переставляю их по новой цене. Как только цена касается их при резком движении цены ( чаще всего при новостях)  терминал зависает. (Это все в тестере, в демо и реале не побывал) Почему он зависает ?

О причинах зависания сказать не могу я не экстрасенс, разбирайтесь с кодом эксперта. Могу предположить, что после того как ордер был исполнен ваш эксперт пытается его переставить по новой цене, но так как отложенный ордер уже в рынке ваш эксперт зацикливается. Пробуйте выводить в журнал состояние ключевых переменных эксперта, для анализа логики его работы . 

 
Vitalii Ananev:

О причинах зависания сказать не могу я не экстрасенс, разбирайтесь с кодом эксперта. Могу предположить, что после того как ордер был исполнен ваш эксперт пытается его переставить по новой цене, но так как отложенный ордер уже в рынке ваш эксперт зацикливается. Пробуйте выводить в журнал состояние ключевых переменных эксперта, для анализа логики его работы . 

Вроде все условия проверки правильно ставил:

input int    Magic = 12;          // Магический номер ордеров
input int    Proskalzivanie = 5;  // Проскальзывание
input int    period = 200;        // Количество свечей для анализа волятильности
input int    tral = 20;           // Дистанция траллинга в пунктах
input int    tral_step = 3;       // Шаг срабатывания траллинга
input bool   use_step = true;     // Использовать шаг
input double Lot = 0.01;          // Лот
input double otstups = 0.0006;    // Отступ от цены
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  return;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

void Trailing_Stop(string _Simvol, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
 int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
 for (int pos=OrdersTotal()-1; pos>=0; pos--)
 {
  if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
     OrderMagicNumber()==_Magic && OrderType()<2)
     {
      double SLPrice;
      if (OrderType()==OP_BUY)
      {
       if (_Step_Use)
       {
        RefreshRates();
        if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
        {
         SLPrice=NormalizeDouble(Ask-_Tral,Dig);
         if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
           Alert("Ошибка модификации ордера: ",GetLastError());
        }
       }
       else
       {
        RefreshRates();
        if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
         {
          SLPrice=NormalizeDouble(Bid+_Tral,Dig);
          if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
           Alert("Ошибка модификации ордера: ",GetLastError());
         }
       }
      }
    }
  }
}

void OnTick()
  {
//---
  double lot=Lot_Normalize(Symbol(),Lot,1);
  double sl= Dist_Normalize(Symbol(),tral);
  double step=Dist_Normalize(Symbol(),tral_step);
  double otstup=NormalizeDouble(otstups,Digits);
  int ord[8];
  Uchet_Orderov_Function(Symbol(),Magic,ord);
  if(ord[7]==2 && ord[6]==0 && Volume[0]==1)
   {
    Udalenie_Orderov_I_Sdelok(Symbol(),Magic, Proskalzivanie);
    if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
    OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
    Print("Ошибка установки ордеров",GetLastError());
   }
  if (ord[6]==0 && ord[7]==0 && Volume[0]==1)
   {
    if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
    OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
    Print("Ошибка установки ордеров",GetLastError());
   }
  if (ord[6]==1)
  {
   Trailing_Stop(Symbol(),Magic,sl,step,use_step);
   for(int i=OrdersTotal()-1; i>0; i++)
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1)
    if (!OrderDelete(OrderTicket(),clrNONE))
      Print("Ошибка удаления ордера!: ", GetLastError());
  }
}
//+------------------------------------------------------------------+
// Средняя волятильность свечей
//+------------------------------------------------------------------+
double Volatility(int _period)
{
 double summ=0;
 for (int i=1; i<=_period; i++)
  {
   summ+=MathAbs(High[i]-Low[i]);
  }
 return(NormalizeDouble(summ/_period,Digits));
}
//+------------------------------------------------------------------+
// Нормализация лота для любых брокеров
//+------------------------------------------------------------------+
double Lot_Normalize(string _Symvol, double _lot, double _mult)
{
 double minlot = MarketInfo(_Symvol,MODE_MINLOT);
 double maxlot = MarketInfo(_Symvol,MODE_MAXLOT);
 double steplot = MarketInfo(_Symvol,MODE_LOTSTEP);
 double lot=_lot*_mult;
 if (lot<=minlot)lot=minlot;
 else if(lot>=maxlot) lot=maxlot;
 else if (lot>minlot && lot<maxlot)
 {
  int k=int((lot-minlot)/steplot);
  lot=NormalizeDouble(minlot+k*steplot,2);
 }
 return(lot);
}

double Dist_Normalize(string _Simvol, int _Distancia)
{
 int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
 double Pip=MarketInfo(_Simvol,MODE_POINT);
 if(Dig==3 || Dig==5)
  return NormalizeDouble(_Distancia*5*Pip,Dig);
 else return NormalizeDouble(_Distancia*Pip,Dig);
}
//+------------------------------------------------------------------+
// Учет ордеров
//+------------------------------------------------------------------+
void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8])
{
 ArrayInitialize(_Mas,0);
 int Ticket=-1;
 for (int pos=OrdersTotal()-1; pos>=0; pos--)
 {
  if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
    OrderMagicNumber()==_Magic && OrderTicket()!=Ticket)
    {
     Ticket=OrderTicket();
     switch(OrderType())
     {
      case 0:{_Mas[0]++;_Mas[6]++;break;}
      case 1:{_Mas[1]++;_Mas[6]++;break;}
      case 2:{_Mas[2]++;_Mas[7]++;break;}
      case 3:{_Mas[3]++;_Mas[7]++;break;}
      case 4:{_Mas[4]++;_Mas[7]++;break;}
      case 5:{_Mas[5]++;_Mas[7]++;break;}
     }
    }
  }
}

void Udalenie_Orderov_I_Sdelok(string _Simvol, int _Magic, int _Proskalzivanie)
{
 for(int pos=OrdersTotal()-1; pos>=0; pos--)
 {
  if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()== _Magic)
  {
   if(OrderType()>1)
   {
    if (!OrderDelete(OrderTicket(),clrNONE))
     Alert("Ошибка при удалении отложенного ордера!" , GetLastError());
   }
  else
   {
    if (OrderType()==OP_BUY)
    {
     if(!OrderClose(OrderTicket(),OrderLots(),Bid,_Proskalzivanie,clrNONE))
       Alert("Ошибка закрытия ордера! ",GetLastError());
    }
    else
    {
     if(!OrderClose(OrderTicket(),OrderLots(),Ask,_Proskalzivanie,clrNONE))
       Alert("Ошибка закрытия ордера! ",GetLastError());
    }
   }
  }
}

}

 
khorosh:
Вы не учитываете, что бай-лимит может ставиться только ниже цены, а селл-лимит выше цены. Для того, что вы предлагаете нужно использовать стоповые ордера.

Согласен, Спасибо за понимание моей запутанки алгоритма. До сих пор путаю названия отложенников...

Пусть будут стоповые, может быть попробуем сваять советник ?

Я его потом потестю и покажу что получится ? 

... или дайте плиз ссылку на такой, ведь не Америку-же я открыл ? 

 
MIR_KAZAN:

Вроде все условия проверки правильно ставил:

input int    Magic = 12;          // Магический номер ордеров
input int    Proskalzivanie = 5;  // Проскальзывание
input int    period = 200;        // Количество свечей для анализа волятильности
input int    tral = 20;           // Дистанция траллинга в пунктах
input int    tral_step = 3;       // Шаг срабатывания траллинга
input bool   use_step = true;     // Использовать шаг
input double Lot = 0.01;          // Лот
input double otstups = 0.0006;    // Отступ от цены
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  return;
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+

void Trailing_Stop(string _Simvol, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
 int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
 for (int pos=OrdersTotal()-1; pos>=0; pos--)
 {
  if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
     OrderMagicNumber()==_Magic && OrderType()<2)
     {
      double SLPrice;
      if (OrderType()==OP_BUY)
      {
       if (_Step_Use)
       {
        RefreshRates();
        if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
        {
         SLPrice=NormalizeDouble(Ask-_Tral,Dig);
         if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
           Alert("Ошибка модификации ордера: ",GetLastError());
        }
       }
       else
       {
        RefreshRates();
        if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
         {
          SLPrice=NormalizeDouble(Bid+_Tral,Dig);
          if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
           Alert("Ошибка модификации ордера: ",GetLastError());
         }
       }
      }
    }
  }
}

void OnTick()
  {
//---
  double lot=Lot_Normalize(Symbol(),Lot,1);
  double sl= Dist_Normalize(Symbol(),tral);
  double step=Dist_Normalize(Symbol(),tral_step);
  double otstup=NormalizeDouble(otstups,Digits);
  int ord[8];
  Uchet_Orderov_Function(Symbol(),Magic,ord);
  if(ord[7]==2 && ord[6]==0 && Volume[0]==1)
   {
    Udalenie_Orderov_I_Sdelok(Symbol(),Magic, Proskalzivanie);
    if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
    OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
    Print("Ошибка установки ордеров",GetLastError());
   }
  if (ord[6]==0 && ord[7]==0 && Volume[0]==1)
   {
    if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
    OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
    Print("Ошибка установки ордеров",GetLastError());
   }
  if (ord[6]==1)
  {
   Trailing_Stop(Symbol(),Magic,sl,step,use_step);
   for(int i=OrdersTotal()-1; i>0; i++)
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1)
    if (!OrderDelete(OrderTicket(),clrNONE))
      Print("Ошибка удаления ордера!: ", GetLastError());
  }
}
//+------------------------------------------------------------------+
// Средняя волятильность свечей
//+------------------------------------------------------------------+
double Volatility(int _period)
{
 double summ=0;
 for (int i=1; i<=_period; i++)
  {
   summ+=MathAbs(High[i]-Low[i]);
  }
 return(NormalizeDouble(summ/_period,Digits));
}
//+------------------------------------------------------------------+
// Нормализация лота для любых брокеров
//+------------------------------------------------------------------+
double Lot_Normalize(string _Symvol, double _lot, double _mult)
{
 double minlot = MarketInfo(_Symvol,MODE_MINLOT);
 double maxlot = MarketInfo(_Symvol,MODE_MAXLOT);
 double steplot = MarketInfo(_Symvol,MODE_LOTSTEP);
 double lot=_lot*_mult;
 if (lot<=minlot)lot=minlot;
 else if(lot>=maxlot) lot=maxlot;
 else if (lot>minlot && lot<maxlot)
 {
  int k=int((lot-minlot)/steplot);
  lot=NormalizeDouble(minlot+k*steplot,2);
 }
 return(lot);
}

double Dist_Normalize(string _Simvol, int _Distancia)
{
 int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
 double Pip=MarketInfo(_Simvol,MODE_POINT);
 if(Dig==3 || Dig==5)
  return NormalizeDouble(_Distancia*5*Pip,Dig);
 else return NormalizeDouble(_Distancia*Pip,Dig);
}
//+------------------------------------------------------------------+
// Учет ордеров
//+------------------------------------------------------------------+
void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8])
{
 ArrayInitialize(_Mas,0);
 int Ticket=-1;
 for (int pos=OrdersTotal()-1; pos>=0; pos--)
 {
  if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
    OrderMagicNumber()==_Magic && OrderTicket()!=Ticket)
    {
     Ticket=OrderTicket();
     switch(OrderType())
     {
      case 0:{_Mas[0]++;_Mas[6]++;break;}
      case 1:{_Mas[1]++;_Mas[6]++;break;}
      case 2:{_Mas[2]++;_Mas[7]++;break;}
      case 3:{_Mas[3]++;_Mas[7]++;break;}
      case 4:{_Mas[4]++;_Mas[7]++;break;}
      case 5:{_Mas[5]++;_Mas[7]++;break;}
     }
    }
  }
}

void Udalenie_Orderov_I_Sdelok(string _Simvol, int _Magic, int _Proskalzivanie)
{
 for(int pos=OrdersTotal()-1; pos>=0; pos--)
 {
  if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()== _Magic)
  {
   if(OrderType()>1)
   {
    if (!OrderDelete(OrderTicket(),clrNONE))
     Alert("Ошибка при удалении отложенного ордера!" , GetLastError());
   }
  else
   {
    if (OrderType()==OP_BUY)
    {
     if(!OrderClose(OrderTicket(),OrderLots(),Bid,_Proskalzivanie,clrNONE))
       Alert("Ошибка закрытия ордера! ",GetLastError());
    }
    else
    {
     if(!OrderClose(OrderTicket(),OrderLots(),Ask,_Proskalzivanie,clrNONE))
       Alert("Ошибка закрытия ордера! ",GetLastError());
    }
   }
  }
}

}

Я боюсь не смогу вам помочь, так как ваш код не поддается анализу. Может вы дополните его комментариями для улучшения его понимания. Непонятно для чего используется массив ord[] и какие данные он хранит. Я понял ваш код так: Каждый тик вы записываете тип ордеров в массив (Uchet_Orderov_Function(Symbol(),Magic,ord);)  затем проверяется условие if(ord[7]==2 && ord[6]==0 && Volume[0]==1) и если оно истино то удаляются отложенные ордера и закрываются все сделки. После чего идет проверка условия    if (ord[6]==0 && ord[7]==0 && Volume[0]==1) и если оно истино то открываются два отложенных ордера. Но при этом у вас значение массива ord[] перед проверкой условия if (ord[6]==0 && ord[7]==0 && Volume[0]==1) не обновляется. И обновится оно только на втором тике.

Вообщем выводите в журнал состояние всех значений массива ord[] которые влияют на логику его работы.

Еще обратите внимание на этот кусок кода:

 if (ord[6]==1)
  {
   Trailing_Stop(Symbol(),Magic,sl,step,use_step);
   for(int i=OrdersTotal()-1; i>0; i++)
    if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1)
    if (!OrderDelete(OrderTicket(),clrNONE))
      Print("Ошибка удаления ордера!: ", GetLastError());
  } 

 По моему там не хватает программных скобок { . По идее должно быть так:

 if (ord[6]==1)
  {
   Trailing_Stop(Symbol(),Magic,sl,step,use_step);
   for(int i=OrdersTotal()-1; i>0; i++)
   {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1)
       if (!OrderDelete(OrderTicket(),clrNONE))
          Print("Ошибка удаления ордера!: ", GetLastError());
   }
  } 
 
Vitalii Ananev:


Еще обратите внимание на этот кусок кода:

 По моему там не хватает программных скобок { . По идее должно быть так:

В данном случае скобки на работу (логику) не влияют.  Ошибки нет

 
Victor Nikolaev:

В данном случае скобки на работу (логику) не влияют.  Ошибки нет

Может и не влияют, но читать так удобнее.
 
akarustam:

Согласен, Спасибо за понимание моей запутанки алгоритма. До сих пор путаю названия отложенников...

Пусть будут стоповые, может быть попробуем сваять советник ?

Я его потом потестю и покажу что получится ? 

... или дайте плиз ссылку на такой, ведь не Америку-же я открыл ? 

Чтобы что-то предлагать, нужно иметь хотя бы элементарные знания. Все простые идеи давно опробованы и действительно  вы не открыли Америку. А вот искать для вас ссылку по форумам и кодобазе вряд ли кто будет. Вам нужно - вы и ищите. Или вы полагаете, что есть такие люди которые держат в памяти ссылки на всевозможные советники, скрипты и индикаторы?
 
khorosh:
Чтобы что-то предлагать, нужно иметь хотя бы элементарные знания. Все простые идеи давно опробованы и действительно  вы не открыли Америку. А вот искать для вас ссылку по форумам и кодобазе вряд ли кто будет. Вам нужно - вы и ищите. Или вы полагаете, что есть такие люди которые держат в памяти ссылки на всевозможные советники, скрипты и индикаторы?
...полагал.
 

Есть идея нужна помощь)) Напишите под это советник

 По сути Машка но c не стандартными настройками) торгую по ней давно. Выходит от 1000 пунктов месяц по одной паре. Так как мониторить все невозможно,решил обраться к специалистам. Просадки практически нет, максимум 5 пунктов) Тут можно и с обьемами поиграться и на несколько пар поставить так как на 1 пару идет только 1 сделка. 

  Таймфрейм H4 

1. МА4/simple\close 

2. MA5/simple\open

Принцип работы должен быть такой..
Без тейк-профитов и стоп лосов. Открывать и закрывать сделки только по пересечениям. НАпример перескло снизу вверх открыл ордер верх, закрывать ордер только тогда когда пересечет обратно. При получении обратного сигнала, чтоб закрывал сделку бай открывал сел. Вообще я надеюсь вы поняли) в стратегии важна не прибыль даже, а эти долбаные пересечения) Как то так) Торгую по этой стратегии давно, прибыль хорошая, но так как мне кажеться написать к этой стратегии советник будет не сложно. 

Если согласны помочь вот Мой МАиЛ: 4iterRrock@mail.ru

Ниже мой шаблон по которому торгую уже почти год. 

Файлы:
MAxi2r.tpl  2 kb
Причина обращения: