0
//+------------------------------------------------------------------+
//|                           Copyright © 2021, forex-time@mail.ru   |
//+------------------------------------------------------------------+
#property copyright   "Copyright © 2021, forex-time@mail.ru"
#property strict 
//+------------------------------------------------------------------+
enum trade
  {
   Auto,  //Авто
   Fixed  //Ручная
  };
//+----------------+
extern trade  MethodTrade = Auto;  //Торговля МЕНЮ ==>>

extern double Lots        = 0.1;   //Фиксированный лот
extern double MaxLot      = 5.0;   //MAX лот
extern double KLot        = 2.0;   //Увеличение лота

extern double Profit      = 15.0;  //Закрыть общий профит $

extern int    TakeProfit  = 0;     //Тейк профит (=0 откл)
extern int    DistNewOrd  = 300;   //Дистанция новый ордер
extern int    MaxOrd      = 10;    //MAX ордеров
extern int    Magic       = 0;     //Магик ордеров

extern string IndMA       = "=== Moving Average ==="; //Индикатор ===>>
extern int    PeriodMA    = 20;            //Период
extern int    ShiftMA     = 3;             //Сдвиг линии
extern ENUM_MA_METHOD MethodMA = MODE_SMA; //Метод
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   //Убрать сетку при тесте
   if(IsTesting()) ChartSetInteger(0,CHART_SHOW_GRID,false);
return(INIT_SUCCEEDED);}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Comment("");}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(OP(-1)>0 && //Если есть ордера
     (PrfOP(-1)>Profit|| //Общий профит больше значения
     (OP(0)==0 && OP(1)==0))) //Нет открытых рыночных ордеров
      DeleteAll(); //Закрыть и удалить все ордера

   //Если выбран метод торговли АВТО
   if(MethodTrade==Auto){
     //Сигналы индикатора МА
     int SignalMA=-1;
     //Цена открытия текущей свечи выше МА и цена открытия предыдущей свечи ниже МА
     if(Open[0]>MA(0) && Open[1]<=MA(1)) SignalMA=0;
     //Цена открытия текущей свечи ниже МА и цена открытия предыдущей свечи выше МА
     if(Open[0]<MA(0) && Open[1]>=MA(1)) SignalMA=1;
     //Если нет ордеров, то открыть первый по сигналу МА
     if(OP(-1)==0){
        double TPb=0.0,TPs=0.0;
        if(TakeProfit>0){
           TPs=ND(Bid-TakeProfit*Point,Digits);
           TPb=ND(Ask+TakeProfit*Point,Digits);
           }
        //Сигнал МА, открыть ордер в направлении
        if(SignalMA==0) Send(OP_BUY,Lots,Ask,0,TPb,Blue);
        if(SignalMA==1) Send(OP_SELL,Lots,Bid,0,TPs,Red);
        }
      }
   //Если есть рыночные ордера то ставить отложенные
   if((OP(0)>0||OP(1)>0) && OP(-1)<MaxOrd)
     {
      //Рассчитать тейк профит для отложенных
      double TPb=0.0,TPs=0.0;
      if(TakeProfit>0){
         TPs=ND(LastPrcOP(0)-(DistNewOrd+TakeProfit)*Point,Digits);
         TPb=ND(LastPrcOP(1)+(DistNewOrd+TakeProfit)*Point,Digits);
         }
      //Поставить отложенный противоположный последнему рыночному 
      int Spread=int(((Ask-Bid)/Point)*2); //Дистанция нового ордера должна быть больше спреда *2
      if(DistNewOrd>0 && DistNewOrd>=Spread){
      if(LastTypeOP()==0 && OP(5)==0) Send(OP_SELLSTOP,Lot(),ND(LastPrcOP(0)-DistNewOrd*Point,Digits),0,TPs,Red);
      if(LastTypeOP()==1 && OP(4)==0) Send(OP_BUYSTOP,Lot(),ND(LastPrcOP(1)+DistNewOrd*Point,Digits),0,TPb,Blue);
      }
    }
  }   
//+------------------------------------------------------------------+
//| Индикатор Moving Average                                         |
//+------------------------------------------------------------------+
double MA(int bar){ 
   double ma=iMA(Symbol(),0, PeriodMA,ShiftMA,MethodMA,PRICE_CLOSE, bar);
return(ma);}
//+------------------------------------------------------------------+
//| Подсчет открытых ордеров по типу                                 |
//+------------------------------------------------------------------+
int OP(int type=-1){
   int op=0;
   for(int i=OrdersTotal()-1;i>=0;i--) 
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol()){
   if(OrderType()==type||type<0) op++;}
return(op);}
//+------------------------------------------------------------------+
//| Профит всех ордеров по типу                                      |
//+------------------------------------------------------------------+
double PrfOP(int type=-1){
   double pf=0.0;
   for(int i=OrdersTotal()-1;i>=0;i--) 
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderSymbol()==Symbol()){
   if(OrderType()==type||type<0) pf+=OrderProfit()+OrderCommission()+OrderSwap();}
return(pf);}
//+------------------------------------------------------------------+
//| Цена последнего ордера по типу                                   |
//+------------------------------------------------------------------+
double LastPrcOP(int type=-1){
   double prc=0.0;
   datetime t=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol()){
   if((OrderType()==type||type<0) && t<OrderOpenTime()) {t=OrderOpenTime(); prc=OrderOpenPrice();}}
return(prc);}
//+------------------------------------------------------------------+
//| Тип последнего ордера                                            |
//+------------------------------------------------------------------+
int LastTypeOP(){
   int type=-1;
   datetime t=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol()){
   if(t<OrderOpenTime()) {t=OrderOpenTime(); type=OrderType();}}
return(type);}
//+------------------------------------------------------------------+
//| Расчёт лота                                                      |
//+------------------------------------------------------------------+
double Lot(){
   double lot=0;
   if(OP(-1)>0) lot=ND(Lots*MathPow(KLot,OP(-1)),2);
   if(lot>MaxLot) lot=Lots;
return(lot);}
//+------------------------------------------------------------------+
//| ND - нормализация числа                                          |
//-------------------------------------------------------------------+
double ND(double value, int digits) {  
      return(NormalizeDouble(value, digits));}
//+------------------------------------------------------------------+
//| Открытие, закрытие ордеров                                       | 
//+------------------------------------------------------------------+
void Send(int type, double lt, double price, double sl, double tp, color clr){
   int send=0;
       send=OrderSend(Symbol(),type,lt,price,30,sl,tp,"",Magic,0,clr);
   if (send>0)
       Print("Успешно открыт ордер "+TypeToStr(type),", Lot: "+(string)lt,", Ticket: "+(string)send,", Magic: "+(string)Magic);
       else 
       Print("Невозможно открыть ордер "+TypeToStr(type),". Ошибка: "+string(GetLastError()));}
//+------------------------------------------------------------------+ 
void DeleteAll(){
   color cls=Gray;
   for(int i=OrdersTotal()-1; i>=0; i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol()){
   if(OrderType()==OP_BUY)  cls=DeepSkyBlue;
   if(OrderType()==OP_SELL) cls=Magenta;
   if(!OrderSelect(OrderTicket(),SELECT_BY_TICKET)||OrderCloseTime()>0) return;
   if(OrderType()<2 && !OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),30,cls)) Print("Невозможно закрыть ордер "+TypeToStr(OrderType()),". Ошибка: "+string(GetLastError()));
   if(OrderType()>1 && !OrderDelete(OrderTicket())) Print("Невозможно удалить ордер "+TypeToStr(OrderType()),". Ошибка: "+string(GetLastError()));}} 
//+------------------------------------------------------------------+ 
string TypeToStr(int type) {
   switch(type) {
      case 0: return("Buy");
      case 1: return("Sell");
      case 2: return("BuyLimit");
      case 3: return("SellLimit");
      case 4: return("BuyStop");
      case 5: return("SellStop");}
return("NONE");}
//-------------------------------------------------------------------+
avatar

forextime

  • 7 декабря 2021, 13:35
0
Добавил условие
Если нет рыночных ордеров, то удалить отложенные ордера
avatar

forextime

  • 7 декабря 2021, 13:34
0
Сделал всё по тех.заданию
//+------------------------------------------------------------------+
//|                           Copyright © 2021, forex-time@mail.ru   |
//+------------------------------------------------------------------+
#property copyright   "Copyright © 2021, forex-time@mail.ru"
#property strict 
//+------------------------------------------------------------------+
extern double Lots       = 0.1;   //Фиксированный лот
extern double MaxLot     = 5.0;   //MAX лот
extern double KLot       = 2.0;   //Увеличение лота

extern double Profit     = 15.0;  //Закрыть общий профит $

extern int    TakeProfit = 0;     //Тейк профит (=0 откл)
extern int    DistNewOrd = 300;   //Дистанция новый ордер
extern int    MaxOrd     = 10;    //MAX ордеров
extern int    Magic      = 0;     //Магик ордеров
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   //Убрать сетку при тесте
   if(IsTesting()) ChartSetInteger(0,CHART_SHOW_GRID,false);
return(INIT_SUCCEEDED);}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Comment("");}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //Если есть ордера и общий профит больше значения, то закрыть всё и отложенные удалить
   if(OP(-1)>0 && PrfOP(-1)>Profit) DeleteAll();
    
   //Если есть рыночные ордера то ставить отложенные
   if((OP(0)>0||OP(1)>0) && OP(-1)<MaxOrd)
     {
      //Рассчитать тейк профит для отложенных
      double TPb=0.0,TPs=0.0;
      if(TakeProfit>0){
         TPs=ND(LastPrcOP(0)-(DistNewOrd+TakeProfit)*Point,Digits);
         TPb=ND(LastPrcOP(1)+(DistNewOrd+TakeProfit)*Point,Digits);
         }
      //Поставить отложенный противоположный последнему рыночному 
      int Spread=int(((Ask-Bid)/Point)*2); //Дистанция нового ордера должна быть больше спреда *2
      if(DistNewOrd>0 && DistNewOrd>=Spread){
      if(LastTypeOP()==0 && OP(5)==0) Send(OP_SELLSTOP,Lot(),ND(LastPrcOP(0)-DistNewOrd*Point,Digits),0,TPs,Red);
      if(LastTypeOP()==1 && OP(4)==0) Send(OP_BUYSTOP,Lot(),ND(LastPrcOP(1)+DistNewOrd*Point,Digits),0,TPb,Blue);
      }
    }
  }   
//+------------------------------------------------------------------+
//| Подсчет открытых ордеров по типу                                 |
//+------------------------------------------------------------------+
int OP(int type=-1){
   int op=0;
   for(int i=OrdersTotal()-1;i>=0;i--) 
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol()){
   if(OrderType()==type||type<0) op++;}
return(op);}
//+------------------------------------------------------------------+
//| Профит всех ордеров по типу                                      |
//+------------------------------------------------------------------+
double PrfOP(int type=-1){
   double pf=0.0;
   for(int i=OrdersTotal()-1;i>=0;i--) 
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2 && OrderSymbol()==Symbol()){
   if(OrderType()==type||type<0) pf+=OrderProfit()+OrderCommission()+OrderSwap();}
return(pf);}
//+------------------------------------------------------------------+
//| Цена последнего ордера по типу                                   |
//+------------------------------------------------------------------+
double LastPrcOP(int type=-1){
   double prc=0.0;
   datetime t=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol()){
   if((OrderType()==type||type<0) && t<OrderOpenTime()) {t=OrderOpenTime(); prc=OrderOpenPrice();}}
return(prc);}
//+------------------------------------------------------------------+
//| Тип последнего ордера                                            |
//+------------------------------------------------------------------+
int LastTypeOP(){
   int type=-1;
   datetime t=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol()){
   if(t<OrderOpenTime()) {t=OrderOpenTime(); type=OrderType();}}
return(type);}
//+------------------------------------------------------------------+
//| Расчёт лота                                                      |
//+------------------------------------------------------------------+
double Lot(){
   double lot=0;
   if(OP(-1)>0) lot=ND(Lots*MathPow(KLot,OP(-1)),2);
   if(lot>MaxLot) lot=Lots;
return(lot);}
//+------------------------------------------------------------------+
//| ND - нормализация числа                                          |
//-------------------------------------------------------------------+
double ND(double value, int digits) {  
      return(NormalizeDouble(value, digits));}
//+------------------------------------------------------------------+
//| Открытие, закрытие ордеров                                       | 
//+------------------------------------------------------------------+
void Send(int type, double lt, double price, double sl, double tp, color clr){
   int send=0;
       send=OrderSend(Symbol(),type,lt,price,30,sl,tp,"",Magic,0,clr);
   if (send>0)
       Print("Успешно открыт ордер "+TypeToStr(type),", Lot: "+(string)lt,", Ticket: "+(string)send,", Magic: "+(string)Magic);
       else 
       Print("Невозможно открыть ордер "+TypeToStr(type),". Ошибка: "+string(GetLastError()));}
//+------------------------------------------------------------------+ 
void DeleteAll(){
   color cls=Gray;
   for(int i=OrdersTotal()-1; i>=0; i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symbol()){
   if(OrderType()==OP_BUY)  cls=DeepSkyBlue;
   if(OrderType()==OP_SELL) cls=Magenta;
   if(!OrderSelect(OrderTicket(),SELECT_BY_TICKET)||OrderCloseTime()>0) return;
   if(OrderType()<2 && !OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),30,cls)) Print("Невозможно закрыть ордер "+TypeToStr(OrderType()),". Ошибка: "+string(GetLastError()));
   if(OrderType()>1 && !OrderDelete(OrderTicket())) Print("Невозможно удалить ордер "+TypeToStr(OrderType()),". Ошибка: "+string(GetLastError()));}} 
//+------------------------------------------------------------------+ 
string TypeToStr(int type) {
   switch(type) {
      case 0: return("Buy");
      case 1: return("Sell");
      case 2: return("BuyLimit");
      case 3: return("SellLimit");
      case 4: return("BuyStop");
      case 5: return("SellStop");}
return("NONE");}
//-------------------------------------------------------------------+
avatar

forextime

  • 6 декабря 2021, 19:16
+1
Кто писал этот код советника?
Там столько глупостей, что без вознаграждения переделывать и дополнять не буду.
Чтобы там что-то править, требуется сначала привести код в порядок.
Обсудить работу: forex-time@mail.ru
avatar

forextime

  • 25 мая 2021, 12:35
0
Поправил и дополнил индикатор Gisto
Советник по этому индикатору и индикатор в архиве
Скачать
Редактировать
avatar

forextime

  • 30 марта 2021, 16:48
+1
Андерй пишет в одном и том же стиле и на одном и том же уровне
Не развивается как программист, работает шаблонно, я ему об этом говорил и это мы уже обсуждали с ним.
===========================
По поводу предъявы по вознаграждению за выполнение работы
Любая работа должна вознаграждаться если она требует усилий
У меня многие работы выполнены бесплатно, так же есть и платные работы но только из-за сложности, а не от жадности
Если кажется что это пустяковое тех.задание, тогда интересно будет посмотреть на её выполнение со стороны))
OrderType()==-1 это полный бред, но дилетанту сложно будет понять, а спорить и что-то доказывать на эту тему не собираюсь это точно!
avatar

forextime

  • 21 февраля 2021, 14:46
+1
Что значит мне тип ордера должен??
Вот и где же в этой предоставленной документации обозначено что если OrderType()==-1 то выбирается любой тип ордера??
avatar

forextime

  • 21 февраля 2021, 14:35
0
Это Андрей так пишет??
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
void DeleteAll(int ot=-1){
   bool cl;
   for(int i=OrdersTotal()-1; i>=0; i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){           
              if(OrderType()==OP_BUYLIMIT){RefreshRates();cl=OrderDelete(OrderTicket());}
              if(OrderType()==OP_SELLLIMIT){RefreshRates();cl=OrderDelete(OrderTicket());}
              if(OrderType()==OP_BUYSTOP){RefreshRates();cl=OrderDelete(OrderTicket());}
              if(OrderType()==OP_SELLSTOP){RefreshRates();cl=OrderDelete(OrderTicket());}
             if(OrderType()==-1){RefreshRates();cl=OrderDelete(OrderTicket());}
           }
        }
     }
  }

=================================================
Что за проверка OrderType()==-1
Тип ордера может быть от 0 до 5


=================================================
Правильно будет так
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
void DeleteAll(int ot=-1){
   bool cl;
   for(int i=OrdersTotal()-1; i>=0; i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){ 
              RefreshRates();          
              if(OrderType()==OP_BUYLIMIT  && ot==2) cl=OrderDelete(OrderTicket());
              if(OrderType()==OP_SELLLIMIT && ot==3) cl=OrderDelete(OrderTicket());
              if(OrderType()==OP_BUYSTOP   && ot==4) cl=OrderDelete(OrderTicket());
              if(OrderType()==OP_SELLSTOP  && ot==5) cl=OrderDelete(OrderTicket());
              if(OrderType()>1 && ot==-1) cl=OrderDelete(OrderTicket());
           }
        }
     }
  }  

Иначе для чего он вызывает поиск типа ордера (ot) ??
avatar

forextime

  • 21 февраля 2021, 11:30
0
Ну это не простой советник!
По этому заданию надо приложить не мало усилия и поддержать финансово(28$)
Обсудить тех.задание: forex-time@mail.ru
avatar

forextime

  • 20 февраля 2021, 16:45
0
Свободного времени нет для выполнения такого рода заказа.
Так же нет конкретики что и где рисовать и почему.
Можно обсудить платную версию индикатора forex-time@mail.ru
avatar

forextime

  • 19 июля 2020, 18:49
0
Не понятно какие моменты именно требуется обозначить на графике и чем обозначить, стрелкой?
1.Если есть пересечение линией уровня?
2.Если появилась цветная гистограмма?
3.Если цветная гистограмма выше-ниже предыдущей?
Подробней и наглядней бы.
avatar

forextime

  • 14 июля 2020, 23:33
0
Сделал на скорую руку, вознаграждение приветствуется))
Исправленная и дополненная версия
Скачать: www.opentraders.ru/downloads/2707/
avatar

forextime

  • 27 июня 2020, 14:37
0
Там другая роль у кнопки Buy и Sell, нажали и ждём пока цена коснётся линии, это типа разрешить открытие ордера.
Только кнопка Close реагирует сразу на закрытие.
avatar

forextime

  • 26 июня 2020, 19:52
0
Бывают и бесплатные поправки-дополнения.
По коду будут исправления
1. Тралл гуляет туда-сюда, а должен тянуться только за ценой
2. Открытие ордера при касании 1-ой линии текущ.ценой. Зачем там дельта (отступ от линии) чтобы не промахнуться?))
3. Три линии на графике, на первой открытие, на третьей ТП, зачем вторая линия (она не используется)
4. По тех.заданию я так понимаю кнопки надо удалить?
avatar

forextime

  • 26 июня 2020, 19:49
0
Эти доработки не относятся к бесплатным, т.к. для реализации нужно выделять время, а свободного и бесплатного пока нет.
avatar

forextime

  • 26 июня 2020, 14:04
0
Slava78 указал что поменять в коде чтобы закрытие было по обратному сигналу

avatar

forextime

  • 12 июня 2020, 12:07
0
Что пишет в журнале-эксперты, есть там причина почему не удаляет? Если геп то где лотов больше рыночных ордеров? Так же текущ.цена после гепа скорее всего за уровнем ТП и в итоге нет возможности его поставить, только стоп лосс Б/У возможен.
avatar

forextime

  • 10 июня 2020, 12:44