+1
Переписал функцию закрытия по эквити. Вывел в окно терминала значение просадки в процентах.


extern double hour=23;         // если значение больше 0 включается закрытие по времени. 
extern double EquityRisk=20.0; // если значение больше 0 включается закрытие по эквити. вычисляется в процентах от баланса.




Обновил советник в базе: www.opentraders.ru/downloads/539/
avatar

AM2

  • 24 декабря 2014, 23:00
+1
Добавил в советник обе функции, но пока работает только закрытие по времени. Остальное будет позже.



Файл в базе: www.opentraders.ru/downloads/539/
avatar

AM2

  • 24 декабря 2014, 10:53
0
Начал понемногу разбираться в коде. Уточните каким именно образом увеличивать лот? Желательно со скринами. Сейчас увеличивает, но там есть разные условия для выставления ордеров. Нужно подробнее.
В файле 2 версии. 1-я почищенный от предупреждений файл, 2-я неограниченная геометрическая прогрессия(«Sawamoroz.mq4»).



Файл в базе: www.opentraders.ru/downloads/536/
avatar

AM2

  • 23 декабря 2014, 10:44
0
kipjatok001, у тебя уже столько советников! создается ощущение, что море! хотя бы по предыдущим результаты тестирования выложил бы.


Возможно деньги любят тишину!? 8-) 

То что попроще в ближайшее время сделаю, а посложнее в праздники.
avatar

AM2

  • 22 декабря 2014, 22:42
0
Вместо аск или вид ставим. Рекомендуют так делать.
avatar

AM2

  • 22 декабря 2014, 22:37
0
ticket=OrderSend(Symbol(),OP_SELL,NormalizeDouble(lot,2),Ask,Slip,0,0,«Sell Order»,Magic,0,Red);

Надо ASK поменять на BID. А то он не усредняет в селл.

Исправил аск на бид. Сделал чтобы усреднялся на следующей свече:
www.opentraders.ru/downloads/534/
avatar

AM2

  • 22 декабря 2014, 22:36
0
2 часа просидел с чужим кодом, пока никак. Не понятно как лот увеличивается в коде
avatar

AM2

  • 21 декабря 2014, 23:32
0
Можно также Close[0] поставить или проскальзывание увеличить и будет усреднять.
avatar

AM2

  • 21 декабря 2014, 22:01
0
Добавил в советник параметры:

extern int    MaxTrades   = 10;          // количетсво трейдов
extern double KLot        = 2;           // коэффициент увеличения объема
extern double KStep       = 2;           // увеличение шага между ордерами




//+------------------------------------------------------------------+
//|                                                        Vikas.mq4 |
//|                                              Copyright 2014, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict

extern int    StopLoss    = 190;         // стоп лосс ордера
extern int    TakeProfit  = 50;          // тейк профит ордера
extern int    Step        = 10;          // шаг между ордерами
extern int    MaxTrades   = 10;          // количетсво трейдов
extern int    Slip        = 3;           // проскальзывание
extern int    EndHour     = 11;          // час окончания торговой сессии
extern int    CountHour   = 8;           // длительность торговой сессии
extern int    Expiration  = 14;          // время истечения ордера
extern int    Delta       = 100;         // расстояние от вершин
extern int    Magic       = 21122014;    // магик
extern double Lots        = 0.1;         // торговый объем
extern double KLot        = 1;           // коэффициент увеличения объема
extern double KStep       = 10;          // увеличение шага между ордерами

int ticket;
double step,lot,tp,sl,price;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   if(Digits==3 || Digits==5)
    {
     TakeProfit*=10;
     StopLoss*=10;     
     Step*=10;
     Slip*=10;
    }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int b=0,s=0;  
   datetime expiration = TimeCurrent()+3600*Expiration;
   double up=iHigh(Symbol(),PERIOD_H1,iHighest(NULL,0,MODE_HIGH,CountHour,1));
   double dn=iLow(Symbol(),PERIOD_H1,iLowest(NULL,0,MODE_LOW,CountHour,1));
   double delta=up-dn;

   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderType()==OP_BUYSTOP)b++;
         if(OrderType()==OP_SELLSTOP)s++; 
        }
      }
    }
               
   if(CountTrades()==0 && Hour()==EndHour && Ask<up && b<1)
    {
     price=up+Delta*Point;
     step=Step;
     lot=Lots;    
     ticket=OrderSend(Symbol(),OP_BUYSTOP,lot,price,3,price-StopLoss*Point,price+TakeProfit*Point,"",Magic,expiration,Blue);
    } 
   
   if(CountTrades()==0 && Hour()==EndHour && Bid>dn && s<1)
    {
     price=dn-Delta*Point;
     step=Step;
     lot=Lots;         
     ticket=OrderSend(Symbol(),OP_SELLSTOP,lot,price,3,price+StopLoss*Point,price-TakeProfit*Point,"",Magic,expiration,Red);     
    }

   if(CountTrades()>0 && CountTrades()<=MaxTrades)
    {
     int otype = FindOrderType();

     if(otype == OP_BUY)
      {
       price = FindLastBuyPrice();
       if((price-Ask)/Point>=step)
        {
         ticket=OrderSend(Symbol(),OP_BUY,NormalizeDouble(lot,2),Ask,Slip,0,0,"Buy Order",Magic,0,Blue);
         ModifyOrders();
         lot=lot*KLot;         
         step=step*KStep;         
        }
      }
      
     else if(otype == OP_SELL)
      {
       price = FindLastSellPrice();
       if((Bid-price)/Point>=step)
        {
         ticket=OrderSend(Symbol(),OP_SELL,NormalizeDouble(lot,2),Ask,Slip,0,0,"Sell Order",Magic,0,Red);
         ModifyOrders();
         lot=lot*KLot;         
         step=step*KStep; 
        }       
      }      
    }
    
   if(CountTrades()>0)DelOrder();
   Comment("\nШаг: ",step,
           "\nЛот: ",NormalizeDouble(lot,2),
           "\nПозиций : ",CountTrades());    
  }
//+------------------------------------------------------------------+
void ModifyOrders()
  {
   double all=0;
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderType()==OP_BUY || OrderType()==OP_SELL)
          {
           all+=OrderOpenPrice();
           count++;
          }
        }
      }
    }   
   all=NormalizeDouble(all/count,Digits);
   
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderType()==OP_BUY)
          {
           tp=NormalizeDouble(all+TakeProfit*Point,Digits);
           sl=NormalizeDouble(all-StopLoss*Point,Digits);
           bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
           
          }
         else 
         if(OrderType()==OP_SELL)
          {
           tp=NormalizeDouble(all-TakeProfit*Point,Digits);
           sl=NormalizeDouble(all+StopLoss*Point,Digits);
           bool mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
          }          
        }
      }
    }      
  }  
//+------------------------------------------------------------------+
int FindOrderType()
  {
   int oticket, ticketNumber=0,type=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         oticket=OrderTicket();
         if(oticket>ticketNumber)
          {
           ticketNumber=oticket;
           type=OrderType();
          }
        }
      }
    }
    return(type);
  }  
//+------------------------------------------------------------------+
double FindLastBuyPrice()
  {
   int oticket, ticketNumber=0;
   double oprice=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
        {
         oticket=OrderTicket();
         if(oticket>ticketNumber)
          {
           ticketNumber=oticket;
           oprice=OrderOpenPrice();
          }
        }
      }
    }
    return(oprice);
  }
//+------------------------------------------------------------------+
double FindLastSellPrice()
  {
   int oticket, ticketNumber=0;
   double oprice=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
        {
         oticket=OrderTicket();
         if(oticket>ticketNumber)
          {
           ticketNumber=oticket;
           oprice=OrderOpenPrice();
          }
        }
      }
    }
    return(oprice);
  }      
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
    {
     if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderType()==OP_BUY || OrderType()==OP_SELL)
          count++;
        }
      }
    }
    return(count);
  }
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del; 
   for (int i=OrdersTotal()-1; i>=0; i--) 
    {
     if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
       if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {      
         if (OrderType()==OP_BUYSTOP)  del=OrderDelete(OrderTicket()); 
         if (OrderType()==OP_SELLSTOP) del=OrderDelete(OrderTicket());
        }
      }       
    }    
  }
//+------------------------------------------------------------------+
avatar

AM2

  • 21 декабря 2014, 09:38
0
Сделал предварительную версию советника. Выставляет ордера по краям коробки, затем усредняет.



Файл в базе: www.opentraders.ru/downloads/534/

avatar

AM2

  • 20 декабря 2014, 18:19
+2
В тестере сейчас без ошибок, если не считать ошибку 0 — нет ошибок. Посмотрим на демо, когда она появляется.
avatar

AM2

  • 18 декабря 2014, 19:01
0
Кстати, я сразу не заметил, что советник не выводит в б/у, даже в тестере.


В тестере в БУ выводит

avatar

AM2

  • 18 декабря 2014, 17:46
0
Обновленный вариант поставил на демо. Полностью устранить появление ошибок в тестере пока не удалось.
avatar

AM2

  • 18 декабря 2014, 17:41
0
Сделал советник для МТ4. При приближении цены к указанному значению, эксперт отсылает письмо на вашу почту. Если настроить в почтовом ящике отправку СМС при получении нового письма, то известие о событии в терминале, будет приходить к вам на телефон.

Настройки:


extern double Price = 1.30000; // цена около которой шлем СМС
extern int    Delta = 5;       // расстояние до цены




Советник в базе: www.opentraders.ru/downloads/531/

avatar

AM2

  • 17 декабря 2014, 19:53
0
Это почти то же самое:



Советник здесь: www.opentraders.ru/downloads/515/
avatar

AM2

  • 17 декабря 2014, 16:42