0
Сделал для одного ордера. Можно погонять в тестере.
www.opentraders.ru/downloads/888/




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

extern double Lots        = 0.1;         // торговый объем
extern int    StopLoss    = 300;         // стоп лосс ордера
extern int    TakeProfit  = 500;         // тейк профит ордера
extern int    BuySell     = 0;           // 0-Off 1-Buy 2-Sell
extern int    LevelProfit = 250;         // Уровень профита в пунктах
extern int    LevelLock   = 250;         // Уровень безубытка-Растояние отолженого стопового ордера от локируемого ордера в пунктах
extern int    Slip        = 30;          // проскальзывание
extern int    Magic       = 111;         // магик  
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int    res=0,p=0,b=0,s=0;
   double pr=0,sl=0,tp=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) p++;
            if(OrderType()==OP_BUYSTOP)  b++;
            if(OrderType()==OP_SELLSTOP) s++;
           }
        }
     }
     
   if(p<1)
     {
      if(BuySell==1)
        {
         //---- buy 
         pr=NormalizeDouble(Ask,Digits);
         if(StopLoss>0) sl=NormalizeDouble(Ask-StopLoss*Point,Digits); else sl=0;
         if(TakeProfit>0) tp=NormalizeDouble(Ask+TakeProfit*Point,Digits);
         res=OrderSend(Symbol(),OP_BUY,Lots,pr,Slip,sl,tp,"",Magic,0,Blue);
         return;
        }

      if(BuySell==2)
        {
         //---- sell   
         pr=NormalizeDouble(Bid,Digits);
         if(StopLoss>0) sl=NormalizeDouble(Bid+StopLoss*Point,Digits); else sl=0;
         if(TakeProfit>0) tp=NormalizeDouble(Bid-TakeProfit*Point,Digits);  else tp=0;
         res=OrderSend(Symbol(),OP_SELL,Lots,pr,Slip,sl,tp,"",Magic,0,Red);
         return;
        }
     }

   if(p>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 && s<1 && p<2)
                 {
                  if(Ask-OrderOpenPrice()>LevelProfit*Point)
                    {
                     pr=NormalizeDouble(Ask-LevelLock*Point,Digits);
                     if(StopLoss>0) sl=NormalizeDouble(pr+StopLoss*Point,Digits); else sl=0;
                     if(TakeProfit>0) tp=NormalizeDouble(pr-TakeProfit*Point,Digits);  else tp=0;
                     res=OrderSend(Symbol(),OP_SELLSTOP,Lots,pr,Slip,sl,tp,"",Magic,0,Red);
                     return;
                    }
                 }

               if(OrderType()==OP_SELL && b<1 && p<2)
                 {
                  if(OrderOpenPrice()-Bid>LevelProfit*Point)
                    {
                     pr=NormalizeDouble(Bid+LevelLock*Point,Digits);
                     if(StopLoss>0) sl=NormalizeDouble(pr-StopLoss*Point,Digits); else sl=0;
                     if(TakeProfit>0) tp=NormalizeDouble(pr+TakeProfit*Point,Digits);  else tp=0;
                     res=OrderSend(Symbol(),OP_BUYSTOP,Lots,pr,Slip,sl,tp,"",Magic,0,Red);
                     return;
                    }
                 }
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 3 октября 2015, 16:11
0
Можно попробовать сделать сначала для одного ордера, потом что то добавить.
avatar

AM2

  • 3 октября 2015, 02:38
+1
Есть стрелки и выключение алерта.




//+------------------------------------------------------------------+
//|                                                          2MA.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict
#property indicator_chart_window

input int Sdvig      = 1; // на каком баре сигнал
input int PutAlert   = 1; // 0-off.

input int MA1Period  = 12;
input int MA1Shift   = 0;
input int MA1Method  = 0;
input int MA1ApPrice = 0;

input int MA2Period  = 55;
input int MA2Shift   = 0;
input int MA2Method  = 0;
input int MA2ApPrice = 0;

double LastOpen=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
/*
double  iMA(
   string       symbol,           // имя символа
   int          timeframe,        // таймфрейм
   int          ma_period,        // период
   int          ma_shift,         // сдвиг средней
   int          ma_method,        // метод усреднения
   int          applied_price,    // тип цены
   int          shift             // сдвиг
   );


MODE_SMA 0 Простое усреднение
MODE_EMA 1 Экспоненциальное усреднение
MODE_SMMA 2 Сглаженное усреднение
MODE_LWMA 3 Линейно-взвешенное усреднение


PRICE_CLOSE 0 Цена закрытия
PRICE_OPEN 1 Цена открытия
PRICE_HIGH 2 Максимальная за период цена
PRICE_LOW 3 Минимальная за период цена
PRICE_MEDIAN 4 Медианная цена, (high+low)/2
PRICE_TYPICAL 5 Типичная цена, (high+low+close)/3
PRICE_WEIGHTED 6 Взвешенная цена закрытия, (high+low+close+close)/4
*/
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutPointer(string name,double price,color clr,int code)
  {
   ObjectCreate(0,name,OBJ_ARROW,0,Time[0],price);
//--- установим код стрелки
   ObjectSetInteger(0,name,OBJPROP_ARROWCODE,code);
//--- установим способ привязки
   ObjectSetInteger(0,name,OBJPROP_ANCHOR,ANCHOR_BOTTOM);
//--- установим цвет стрелки
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- установим стиль окаймляющей линии
   ObjectSetInteger(0,name,OBJPROP_STYLE,STYLE_SOLID);
//--- установим размер стрелки
   ObjectSetInteger(0,name,OBJPROP_WIDTH,3);
//--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(0,name,OBJPROP_BACK,true);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   double MA1=iMA(NULL,0,MA1Period,0,MA1Method,MA1ApPrice,Sdvig);
   double MA12=iMA(NULL,0,MA1Period,0,MA1Method,MA1ApPrice,Sdvig+1);
   double MA2=iMA(NULL,0,MA2Period,0,MA2Method,MA2ApPrice,Sdvig);
   double MA22=iMA(NULL,0,MA2Period,0,MA2Method,MA2ApPrice,Sdvig+1);
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
   if(LastOpen!=open[0])
     {
      if(MA1>MA2 && MA12<MA22)
        {
         PutPointer("UP"+TimeToString(Time[0]),Low[1],Aqua,233);
         if(PutAlert==1) {Alert(Symbol()+" Signal BUY!!!");}
        }
      if(MA1<MA2 && MA12>MA22)
        {
         PutPointer("DN"+TimeToString(Time[0]),High[1],Red,234);
         if(PutAlert==1){Alert(Symbol()+" Signal SELL!!!");}
        }
     }
   LastOpen=open[0];
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 2 октября 2015, 16:51
0
Могу :) 
avatar

AM2

  • 2 октября 2015, 16:14
0
Пробовал переделать стандартный RSI под алерты, но он расчитан только на индикацию текущего бара. Переделал другой. Сигналит при пробитии обоих уровней и туда и обратно.
www.opentraders.ru/downloads/886/




// ---------------------------------------------------------------------------
//  Рассчёт RSI по книге Ч.Лебо и Д.Лукаса, для усреднения используется SMA.
// ---------------------------------------------------------------------------

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1  Red
#property indicator_minimum 0
#property indicator_maximum 100
#property indicator_level1  40
#property indicator_level2  60

// Период индикатора.
extern int PERIOD=9;
extern int RSILevel=40;

double LastOpen=0;
// Буферы индикатора.
double buf_rsi[];
// Рабочий период индикатора.
int work_period;
// Инициализация.
int init()
  {
   IndicatorShortName(StringConcatenate(
                      "SMA RSI (",PERIOD,")"));
   IndicatorDigits(0);

   SetIndexBuffer(0,buf_rsi);
   SetIndexEmptyValue(0,-1);
   SetIndexLabel(0,"SMA RSI("+PERIOD+")");

   work_period=Bars-PERIOD;

   return(0);
  }
// Главный цикл.
int start()
  {
   int i;

   for(i=Bars-IndicatorCounted()-1; i>=0; i--)
     {
      if(i<work_period)
        {
         double up=0,dn=0;
         int j;

         for(j=i+PERIOD-1; j>=i; j--)
           {
            double v=Close[j]-Open[j];

            if(v>0)
              {
               up+=v;
                 } else {
               dn-=v;
              }
           }

         buf_rsi[i]=up/(up+dn)*100;
           } else {
         buf_rsi[i]=-1;
        }
     }
     
   if(Open[0]!=LastOpen)
     {
      if(buf_rsi[1]>RSILevel && buf_rsi[2]<RSILevel) Alert(Symbol()+" Пробитие Уровня RSI "+IntegerToString(RSILevel)+" Снизу Вверх!");
      if(buf_rsi[1]<RSILevel && buf_rsi[2]>RSILevel) Alert(Symbol()+" Пробитие Уровня RSI "+IntegerToString(RSILevel)+" Cверху Вниз!");

      if(buf_rsi[1]>(100-RSILevel) && buf_rsi[2]<(100-RSILevel)) Alert(Symbol()+" Пробитие Уровня RSI "+IntegerToString(100-RSILevel)+" Снизу Вверх!");
      if(buf_rsi[1]<(100-RSILevel) && buf_rsi[2]>(100-RSILevel)) Alert(Symbol()+" Пробитие Уровня RSI "+IntegerToString(100-RSILevel)+" Cверху Вниз!");
     }
   LastOpen=Open[0];
   
   Comment("\n buf_rsi[0] ",buf_rsi[1],
           "\n buf_rsi[1] ",buf_rsi[2]);
   return(0);
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 2 октября 2015, 15:27
0
Нет, за такой сложный я не возьмусь с нуля писать.
avatar

AM2

  • 1 октября 2015, 14:24
0
В коде все расписано:


/*
double  iMA(
   string       symbol,           // имя символа
   int          timeframe,        // таймфрейм
   int          ma_period,        // период
   int          ma_shift,         // сдвиг средней
   int          ma_method,        // метод усреднения
   int          applied_price,    // тип цены
   int          shift             // сдвиг
   );


MODE_SMA 0 Простое усреднение
MODE_EMA 1 Экспоненциальное усреднение
MODE_SMMA 2 Сглаженное усреднение
MODE_LWMA 3 Линейно-взвешенное усреднение


PRICE_CLOSE 0 Цена закрытия
PRICE_OPEN 1 Цена открытия
PRICE_HIGH 2 Максимальная за период цена
PRICE_LOW 3 Минимальная за период цена
PRICE_MEDIAN 4 Медианная цена, (high+low)/2
PRICE_TYPICAL 5 Типичная цена, (high+low+close)/3
PRICE_WEIGHTED 6 Взвешенная цена закрытия, (high+low+close+close)/4
*/
avatar

AM2

  • 1 октября 2015, 14:04
0
Попробую я сейчас с нуля начать, а то когда в чужом советнике много всего наворочено уже не разберешь ничего.

1 — Сов. должен выставить всего два встречных ордера в рынок.
2 — для этих ордеров выставляется СЛ и ТП на заданном расстоянии.
2 — одновременно выставить также два лимитных ордера встречных на заданном расстоянии.
3 — для этих ордеров выставляется СЛ и ТП на заданном расстоянии.
4 — при при закрытии по ТП одного из ордеров в рынке выставляется новый а лимитный ордер в этом направлении
удаляется и на его место выставляется новый.
5 — В сове должно быть 10 отложенных лимитных ордеров, не одновременно а по достижении их срабатывания, чтобы не
засорять экран линиями. Т.е. у нас в рыке 2 ордера, один закрывается по профиту, на его место ставится новый
ордер, а противоположный накапливает минус, и срабатывает очередной лимитный, после того как второй ордер
войдет в рынок, выставляется очередной лимитный ордер с большим лотом, и так продолжается до 10 выставленного
лимитного ордера.
avatar

AM2

  • 1 октября 2015, 14:03
0
Вот увидел сигнал на 5-м баре.

avatar

AM2

  • 1 октября 2015, 13:48
0
В тестере работает. Сейчас еще на демо поставлю.
www.opentraders.ru/downloads/885/

avatar

AM2

  • 1 октября 2015, 13:42
0
Если код смотреть там декомпил, ничего не разберешь.
avatar

AM2

  • 1 октября 2015, 13:24
0
Сейчас посмотрю что можно сделать.
avatar

AM2

  • 1 октября 2015, 12:44
0
Вы мне не ответили. Нужно править какой то готовый индикатор или писать заново?
avatar

AM2

  • 1 октября 2015, 12:34
0
Стрелки индикатора не дают сигнал. Линии дают, а стрелки нет.
avatar

AM2

  • 1 октября 2015, 12:18
+1
Сейчас буду смотреть.
avatar

AM2

  • 1 октября 2015, 11:30
0
Есть такой индикатор с 2-мя мувингами или мне с нуля писать?
avatar

AM2

  • 1 октября 2015, 10:49
0
но помоему как открывал и закрывал на третьем баре, так и открывает.


Посмотрите внимательно при замедленном тесте на контрольных точках или всех тиках, как только индикатор меняет цвет советник закрывает сделку.
BULevel — безубыток. 0-отключен.
avatar

AM2

  • 30 сентября 2015, 20:08
0
Как только индикатор сменил цвет советник закрывает сделку: opentraders.ru/downloads/526/
И трал с БУ там же.

avatar

AM2

  • 30 сентября 2015, 17:04
0
Можно ссылку на индикатор?
avatar

AM2

  • 30 сентября 2015, 15:52
0
В личке вы писали, что советник не работает. Что именно не работает?
Бросил на график, открыл сделки, как положено. Если не получится отладить то что есть, тогда уже с нуля.

avatar

AM2

  • 30 сентября 2015, 09:58