0
//+------------------------------------------------------------------+
//|                              Copyright © 2014, Khlystov Vladimir |
//|                                         http://cmillion.narod.ru |
//+------------------------------------------------------------------+
//#property copyright "Copyright © 2014, cmillion@narod.ru"
//#property link      "http://cmillion.ru"
//#property strict
//#property description "Советник торгует на скачках рынка, при этом не использует никакие индикаторы."
//#property description "Идея советника заключается в том, что стоп ордера дискретно времени перемещаются на заданном расстоянии от текущей цены."
//#property description "Если цена достаточно резко поползла в одну сторону, то советник просто не успевает переместить ордер и он становится рыночным."
//#property description "Далее включается тралл ордера."
 //--------------------------------------------------------------------
extern int     Stoploss             = 10,     //стоплосс, если 0 то не изменяется
               Takeprofit           = 50;     //тейкпрофит, если 0 то не изменяется
extern int     TrailingStop         = 10;     //длинна тралла, если 0 то нет тралла
extern int     TrailingStart        = 0;      //когда включать тралл, например после достижения 40 п прибыл
extern int     StepTrall            = 2;      //шаг тралла - перемещать стоплосс не ближе чем StepTrall
extern int     NoLoss               = 0,      //перевод в безубыток при заданном кол-ве пунктов прибыли, если 0 то нет перевода в безубыток
               MinProfitNoLoss      = 0;      //минимальная прибыль при переводе вбезубыток
extern int     Magic                = 77;     //магик
extern int     Step                 = 10;     //расстояние от цены
extern double  Lot                  = 0.1;
extern int     TimeModify           = 30;     //кол-во секунд раньше которого запрещено изменять ордер
extern int     slippage             = 30;     //Максимально допустимое отклонение цены для рыночных ордеров (ордеров на покупку или продажу).
//--------------------------------------------------------------------
datetime  TimeBarB,TimeBarS;
//--------------------------------------------------------------------
int start()                                  
{
   double STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
   double OSL=0,StLo=0,PriceB=0,PriceS=0,OOP=0,SL=0,TP=0;
   int b=0,s=0,TicketB=0,TicketS=0,OT;
   for (int i=0; i<OrdersTotal(); i++)
   {    
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if (OrderSymbol()==Symbol() && Magic==OrderMagicNumber())
         { 
            OT = OrderType(); 
            OSL = NormalizeDouble(OrderStopLoss(),Digits);
            OOP = NormalizeDouble(OrderOpenPrice(),Digits);
            SL=OSL;
            if (OT==OP_BUY)             
            {  
               b++;
               if (OSL<OOP && NoLoss!=0)
               {
                  StLo = NormalizeDouble(OOP+MinProfitNoLoss*Point,Digits); 
                  if (StLo > OSL && StLo <= NormalizeDouble(Bid - STOPLEVEL * Point,Digits)) SL = StLo;
               }
               
               if (TrailingStop>=STOPLEVEL && TrailingStop!=0 && (Bid - OOP)/Point >= TrailingStart)
               {
                  StLo = NormalizeDouble(Bid - TrailingStop*Point,Digits); 
                  if (StLo>=OOP && StLo > OSL+StepTrall*Point) SL = StLo;
               }
               
               if (SL > OSL)
               {  
                  if (!OrderModify(OrderTicket(),OOP,SL,TP,0,0)) Print("Error ",GetLastError(),"   Order Modify Buy   SL ",OSL,"->",SL);
                  else Print("Order Buy Modify   SL ",OSL,"-",SL);
               }
            }                                         
            if (OT==OP_SELL)        
            {
               s++;
               if ((OSL>OOP || OSL==0) && NoLoss!=0)
               {
                  StLo = NormalizeDouble(OOP-MinProfitNoLoss*Point,Digits); 
                  if ((StLo < OSL || OSL==0) && StLo >= NormalizeDouble(Ask + STOPLEVEL * Point,Digits)) SL = StLo;
               }
               
               if (TrailingStop>=STOPLEVEL && TrailingStop!=0 && (OOP - Ask)/Point >= TrailingStart)
               {
                  StLo = NormalizeDouble(Ask + TrailingStop*Point,Digits); 
                  if (StLo<=OOP && (StLo < OSL-StepTrall*Point || OSL==0)) SL = StLo;
               }
               
               if ((SL < OSL || OSL==0) && SL!=0)
               {  
                  if (!OrderModify(OrderTicket(),OOP,SL,TP,0,0)) Print("Error ",GetLastError(),"   Order Modify Sell   SL ",OSL,"->",SL);
                  else Print("Order Sell Modify   SL ",OSL,"-",SL);
               }
            } 
            if (OT==OP_BUYSTOP)  {PriceB=OOP; TicketB=OrderTicket();}     
            if (OT==OP_SELLSTOP) {PriceS=OOP; TicketS=OrderTicket();}  
         }
      }
   }
   if (b+TicketB==0)
   {
      if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Bid - Stoploss * Point,Digits); else SL=0;
      if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Ask + Takeprofit * Point,Digits); else TP=0;
      if (OrderSend(Symbol(),OP_BUYSTOP,Lot,NormalizeDouble(Ask+Step * Point,Digits),slippage,SL,TP,"news",Magic,0,0)!=-1) TimeBarB=TimeCurrent();
   } 
   if (s+TicketS==0)
   {
      if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Ask + Stoploss * Point,Digits); else SL=0;
      if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Bid - Takeprofit * Point,Digits); else TP=0;
      if (OrderSend(Symbol(),OP_SELLSTOP,Lot,NormalizeDouble(Bid - Step * Point,Digits),slippage,SL,TP,"news",Magic,0,0)!=-1) TimeBarS=TimeCurrent();
   } 
   if (TicketB!=0)
   {
      if (TimeBarB<TimeCurrent()-TimeModify && MathAbs(NormalizeDouble(Ask + Step * Point,Digits)-PriceB)/Point>StepTrall)
      {
         if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Bid - Stoploss * Point,Digits); else SL=0;
         if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Ask + Takeprofit * Point,Digits); else TP=0;
         if (OrderModify(TicketB,NormalizeDouble(Ask + Step * Point,Digits),SL,TP,0,0)) TimeBarB=TimeCurrent();
      }
   } 
   if (TicketS!=0)
   {
      if (TimeBarS<TimeCurrent()-TimeModify && MathAbs(NormalizeDouble(Bid - Step * Point,Digits)-PriceS)/Point>StepTrall)
      {
         if (Stoploss>=STOPLEVEL && Stoploss!=0) SL = NormalizeDouble(Ask + Stoploss * Point,Digits); else SL=0;
         if (Takeprofit>=STOPLEVEL && Takeprofit!=0) TP = NormalizeDouble(Bid - Takeprofit * Point,Digits); else TP=0;
         if (OrderModify(TicketS,NormalizeDouble(Bid - Step * Point,Digits),SL,TP,0,0)) TimeBarS=TimeCurrent();
      }
   } 
return(0);
}
//--------------------------------------------------------------------
avatar

vic123

  • 14 марта 2016, 09:19
0

После модификации отложек, сраэу же удалять стрелки, появляющиеся на графике после модификации.
avatar

vic123

  • 14 марта 2016, 08:53
0
Спасибо всем!!!
Может быть поможете и с моим топиком от 1 марта. В принципе я практически со все разобрался сам, но стрелки при модификации отложек забивают график и очень трудно найти среди них рыночный ордер. Посмотрите пожалуйста советник cm_ea_news, может можно как то избавиться от этих стрелок в процессе тестирования.
С уважением!!!
avatar

vic123

  • 14 марта 2016, 07:38
0
double GetMnog(int ord){
switch(ord){
case 1: return Mnog;
case 2: return Mnog+0.05;
и т.д.

}
return 0;
}

это практически то же самое что и мой первоначальный вариант.
все таки эта функция должна реализоваться на for или while.
avatar

vic123

  • 13 марта 2016, 16:17
0
как узнать Ваш скайп?
avatar

vic123

  • 13 марта 2016, 15:54
0
Дело в том что при тестировании программы выяснилось что может открыться до 35 ордеров. Не описывать же их все в форме первоначальной
avatar

vic123

  • 13 марта 2016, 15:45
0
ПОДСКАЖИТЕ, КАК РЕАЛИЗОВАТЬ ЭТО ЧЕРЕЗ switch
avatar

vic123

  • 13 марта 2016, 15:40
0
Отношение было очень уважительное, но и у тебя должно быть отношение нормальное.
avatar

vic123

  • 2 марта 2016, 00:47
0
Всего то надо было объединить 2 советника в 1. Кто хочет, тот работает.
Кто не хочет, тот ищет причины в виде Т.З., либо заявляет, что проще написать с нуля. То что проще, не всегда лучше
avatar

vic123

  • 2 марта 2016, 00:35
0
Это нестандартный советник. Я все описал в тех.задании. Если Вы не хотите им заниматься напишите и я сам добьюсь реализации своих мыслей. Я просто думал что с Вашей помощью это будет гораздо быстрее. Ведь я безработный и до пенсии еще 1 год. А надо на что-то жить.
avatar

vic123

  • 1 марта 2016, 18:52
0
Для уточнения деталей — мой скайп: ONB_ONB
avatar

vic123

  • 1 марта 2016, 15:23
0
Советник предназначен для торговли с очень небольшим депозитом. Например для Альпари минимальный депозит демо-счета 10$. Для тестирования в самый раз.
Советник не использует никакие индикаторы.
Идея советника заключается в том, что стоп ордера BUY и SELL дискретно времени перемещаются на заданном расстоянии от текущей цены.
Если цена достаточно резко поползла в одну сторону, то советник просто не успевает переместить ордер и он становится рыночным.
Рассмотрим на примере пары EUR_GBP:
В советнике должны быть 2 настраиваемых лота.
1 – для стоповых ордеров и соответственно для первого рыночного ордера.
2 – для остальных ордеров которые будут открываться.
После открытия 1-го рыночного ордера лотом 1 = 0.04
Маржа составляет 2.18* 4 =8.72$ Свободная маржа – около 1.2$
После этого цена идет в нужную сторону свободная маржа растет
И при достижении ею значения 2.18 + NN(свободная настраиваемая маржа для отката цены) советник должен открыть ордер в ту же сторону с лотом 2. И так до тех пор пока все ордера не будут закрыты вручную.
После этого советник вновь начинает открывать стоповые ордера.
Желателен алерт при открытии рыночных ордеров.
На картинке Пример я запустил сегодня советник открывающий ордера по принципу описанному выше. И на 10 $ язаработал еще 10.
avatar

vic123

  • 1 марта 2016, 12:02
0
Хорошо. Спасибо!!!
avatar

vic123

  • 21 февраля 2016, 10:42
0
Спасибо!!!
avatar

vic123

  • 15 февраля 2016, 15:16
0
Как работает этот советник.
Когда быстрая МА выше медленной открывается ордер бай. Если цена пошла не в ту сторону, то через величину TunnelSize=((2*(Ask-Bid)/Point)+TunnelWidth) открывается селл. Если цена опять развернулась и пошла вверх, то через величину TunnelSize открывается ордер бай и так до тех пор, пока при движении в какую либо из сторон не будет достигнут профит.
На флэте может быть открыто слишком много ордеров, поэтому необходимы ограничения по работе советника по времени.
Так же я думаю, что если TunnelWidth будет уменьшаться после открытия 2-го ордера в серии на величину DeltaTunnel, то профит будет достигнут быстрее.

avatar

vic123

  • 15 февраля 2016, 14:21
0
Спасибо Вам!!!
avatar

vic123

  • 22 ноября 2015, 07:57
0
ну что, так никто и не возьмется?
avatar

vic123

  • 16 ноября 2015, 15:41
0
Индикатором Apollo я пользуюсь уже более 3 лет. Проблем не было. Асейчас решил написать на нем советника. И все вроде бы неплохо, но в некоторые дни (в какие я пока не понял периодичность) индикатор начинает «дергаться». Если подскажешь как записать это видео, я тебе перешлю. Ну а советник и индикатор с dll я присылал в прошлом топике.
avatar

vic123

  • 16 ноября 2015, 11:33
0
Но ведь Вы не ставите больше чужие dll. Кстати почему?
avatar

vic123

  • 16 ноября 2015, 11:25
Начать торговлю с Альпари