0
OpenOrder — это для тестера, открывать сделки или нет и какие. Если нужно открывать советником пожалуйста. Магик можно поставить 0 и тогда подхватит любые ордера.
avatar

AM2

  • 17 сентября 2015, 16:41
0
Сейчас в советнике 4 лота и 4 тейка: www.opentraders.ru/downloads/872/




//+------------------------------------------------------------------+
//|                                                     CloseLot.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Simple expert advisor"

#include <stdlib.mqh>

//--- Inputs
extern int StopLoss     = 500;
extern int TakeProfit   = 500;
extern int TakeProfit1  = 100;
extern int TakeProfit2  = 200;
extern int TakeProfit3  = 300;
extern int OpenOrder=2;    //0-off. 1-buy. 2-sell.
extern int Slip         = 30;
extern double Lot       = 1;
extern double Lot1      = 0.1;
extern double Lot2      = 0.2;
extern double Lot3      = 0.4;
extern int    Magic     = 111;

bool CloseOrd1,CloseOrd2,CloseOrd3;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

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

  }
//+------------------------------------------------------------------+
//| Check for open order conditions                                  |
//+------------------------------------------------------------------+
void OpenPos()
  {
   int res=0,err=0;
   double sl;

//--- sell 
   if(OpenOrder==2)
     {
      double bid=MarketInfo(NULL,MODE_BID);
      if(StopLoss==0) sl=0; else sl=bid+StopLoss*Point;
      res=OrderSend(Symbol(),OP_SELL,Lot,bid,Slip,sl,bid-TakeProfit*Point,"",Magic,0,Red);
      if(res<0)
        {
         err=GetLastError();
         Print("ОШИБКА ВЫСТАВЛЕНИЯ ОРДЕРА SELL: ",err,"(",ErrorDescription(err),")");
           } else {
         RefreshRates();
        }
     }

//--- buy 
   if(OpenOrder==1)
     {
      double ask=MarketInfo(NULL,MODE_ASK);
      if(StopLoss==0) sl=0; else sl=ask-StopLoss*Point;
      res=OrderSend(Symbol(),OP_BUY,Lot,ask,Slip,sl,ask+TakeProfit*Point,"",Magic,0,Blue);
      if(res<0)
        {
         err=GetLastError();
         Print("ОШИБКА ВЫСТАВЛЕНИЯ ОРДЕРА BUY: ",err,"(",ErrorDescription(err),")");
           } else {
         RefreshRates();
        }
     }
//---
  }
//+------------------------------------------------------------------+  
void CloseOrders()
  {
   bool cl;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol())
           {
            if(OrderMagicNumber()==Magic)
              {
               if(OrderType()==OP_BUY)
                 {
                  if(Bid-OrderOpenPrice()>TakeProfit1*Point)
                    {
                     if(CloseOrd1) cl=OrderClose(OrderTicket(),Lot1,Bid,Slip,Blue);
                     CloseOrd1=false;
                    }

                  if(Bid-OrderOpenPrice()>TakeProfit2*Point)
                    {
                     if(CloseOrd2) cl=OrderClose(OrderTicket(),Lot2,Bid,Slip,Blue);
                     CloseOrd2=false;
                    }

                  if(Bid-OrderOpenPrice()>TakeProfit3*Point)
                    {
                     if(CloseOrd3) cl=OrderClose(OrderTicket(),Lot3,Bid,Slip,Blue);
                     CloseOrd3=false;
                    }
                 }

               if(OrderType()==OP_SELL)
                 {
                  if(OrderOpenPrice()-Ask>TakeProfit1*Point)
                    {
                     if(CloseOrd1) cl=OrderClose(OrderTicket(),Lot1,Ask,Slip,Red);
                     CloseOrd1=false;
                    }

                  if(OrderOpenPrice()-Ask>TakeProfit2*Point)
                    {
                     if(CloseOrd2) cl=OrderClose(OrderTicket(),Lot2,Ask,Slip,Red);
                     CloseOrd2=false;
                    }

                  if(OrderOpenPrice()-Ask>TakeProfit3*Point)
                    {
                     if(CloseOrd3) cl=OrderClose(OrderTicket(),Lot3,Ask,Slip,Red);
                     CloseOrd3=false;
                    }
                 }
              }
           }
        }
     }
   return;
  }
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
   int 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 || OrderType()==OP_SELL) p++;
           }
        }
     }

   if(p<1) 
     {
      CloseOrd1=true;
      CloseOrd2=true;
      CloseOrd3=true;
      OpenPos();
     }
   if(p>0) CloseOrders();

//---
  }
//+------------------------------------------------------------------+

avatar

AM2

  • 17 сентября 2015, 15:57
0
Нет не получается. Сложный советник.
avatar

AM2

  • 17 сентября 2015, 14:35
0
В советнике 3000 строк кода, несколько вариантов открытия и доливок. *shock*  *think* 

Для начала выключил увеличение лота во всех стратегиях, сейчас попробую сделать увеличение лота как нужно.
avatar

AM2

  • 17 сентября 2015, 13:42
0
Вы описали настройки. Мне нужен принцип работы советника, т.к. я буду писать с нуля.
avatar

AM2

  • 17 сентября 2015, 12:54
0
Опишите подробнее ТЗ.
avatar

AM2

  • 17 сентября 2015, 12:29
0
Если будет свободное время, я посмотрю еще.
avatar

AM2

  • 17 сентября 2015, 12:26
0
Здесь нужно долго сидеть и разбираться в логике индикатора. Быстро решить этот вопрос не удалось.
avatar

AM2

  • 17 сентября 2015, 11:59
0
Сначала попробую привести декомпил в человеческий вид.
avatar

AM2

  • 17 сентября 2015, 11:29
0
Закрытие предыдущей и открытие текущей свечи практически совпадают. Разница совсем небольшая. Поясните подробнее что именно вас не устраивает и как должно быть, желательно со скринами.
avatar

AM2

  • 17 сентября 2015, 11:04
0
Приложите пожалуйста советник.
avatar

AM2

  • 17 сентября 2015, 10:54
0
В результате система рисует красивый график. Может нарисовать такой и за 15 лет, только с небольшой доходностью: www.opentraders.ru/downloads/871/

avatar

AM2

  • 17 сентября 2015, 10:52
0
Почему вы сразу не описали все подробно? Сейчас мне нужно все переделывать заново.
avatar

AM2

  • 17 сентября 2015, 09:50
0
Значит нужно сделать выбор направления после убытка?
Тогда первая сделка будет открываться по какому условию?
И если профит как дальше торгуем?
avatar

AM2

  • 16 сентября 2015, 22:31
0
Я переименовываю индикаторы так как мне удобно. У вас он должен быть под именем MAParabolic.ex4

Вот исходник индикатора:


//+------------------------------------------------------------------+
//|                                             Ma-Parabolic_st2.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                      Copyright © 2008, Лукашук В.Г. aka lukas1.  |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, MetaQuotes + lukas1"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Orchid
#property indicator_color2 Maroon
//---- input parameters
extern int    Ma=14;
extern int    method=3;
extern int    app_price=0;

extern double StepH=0.2;//для верхних точек
extern double MaximumH=0.5;//

extern double StepL=0.02;//для нижних точек
extern double MaximumL=0.05;//

//---- buffers
double SarBuffer[];
double MaBuffer[];
//----
static bool first=false;
bool   dirlong;
double start,last_high,last_low;
double ep,sar,price_low,price_high;
int    i,j;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorDigits(Digits);
   SetIndexLabel(0,NULL); 
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,159);
   SetIndexBuffer(0,SarBuffer);
   int draw_bars=4/MathMin(StepH,StepL);
   if(draw_bars>Bars-100) draw_bars=Bars-100;
   SetIndexDrawBegin(0, draw_bars); 
//----
   SetIndexLabel(1,"period= "+Ma); 
   SetIndexStyle(1,DRAW_LINE,0,2);
   SetIndexBuffer(1,MaBuffer);
   SetIndexDrawBegin(0, draw_bars);
   if(StepH >MaximumH) StepH = MaximumH;
   if(StepL >MaximumL) StepL = MaximumL;
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Parabolic Sell And Reverse system                                |
//+------------------------------------------------------------------+
int start()
  {
   if(Bars<5) return(0);
   dirlong=true;
   start=MathMin(StepH,StepL);
//--------------------------------------------+
   for(j=Bars-4;j>=0;j--)
      MaBuffer[j] = iMA(Symbol(),0,Ma,0,method,app_price,j);

   i=Bars-4;
   while(i>=0)
     {
      price_low=MaBuffer[i]-Point;
      price_high=MaBuffer[i]+Point;
      //sar равен цена предыдущего бара плюс шаг умножить на 
      //(старая цена минус значение SarBuffer предыдущего бара)
      sar=SarBuffer[i+1]+start*(ep-SarBuffer[i+1]);
//----
      if(dirlong)//цепочка вверх
        {
         if(ep<price_high && (start+StepL)<=MaximumL) start+=StepL;
         if(sar>=price_low)//если условия для переключения наступили
           {
            start=StepL; 
            dirlong=false; 
            ep=price_low;//устанавливаем последнюю цену = минимум
            last_low=price_low;
            if(MaBuffer[i]+Point<last_high) SarBuffer[i]=last_high;
            else SarBuffer[i]=MaBuffer[i]+Point;
            i--;
            continue;
           }
         else
           {
            if(ep<price_low && (start+StepL)<=MaximumL) start+=StepL;
            //и пересчитываем last_high и ep для расчета следующей точки максимума
            if(ep<price_high) { last_high=price_high; ep=price_high; }
           }
        }
//----
      else//цепочка вниз
        {
         if(ep>price_low && (start+StepH)<=MaximumH) start+=StepH;
         if(sar<=price_high)//если наступили условия переключения
           {
            start=StepH; 
            dirlong=true; 
            ep=price_high;//устанавливаем последнюю цену = максимум
            last_high=price_high;
            if(MaBuffer[i]-Point>last_low) SarBuffer[i]=last_low;
            else SarBuffer[i]=MaBuffer[i]-Point;
            i--;
            continue;
           }
         else
           {
            if(ep>price_high && (start+StepH)<=MaximumH) start+=StepH;
            //если условия для переключения не наступили
            //то пересчитываем last_low и ep для расчета следующей точки минимума
            if(ep>price_low){last_low=price_low;ep=price_low;}
           }
        }
      SarBuffer[i]=sar;
      i--;
     }
//----
   return(0);
  }
//+------------------------------------------------------------------+
avatar

AM2

  • 16 сентября 2015, 22:03
0
Чтобы быстро понять в чем дело, нужно видеть все перед собой. А так попробуйте удалить индикатор и вставить его через метаэдитор с тем же именем и скомпилировать его.
avatar

AM2

  • 16 сентября 2015, 19:12
0
У вас советник не видит индикатор. Если в журнале не ругается, значит его нужно скомпилировать в MetaEditor.
avatar

AM2

  • 16 сентября 2015, 18:22
0
Индикатор на графике не нужен вообще. Самое главное, чтобы он был скомпилирован, лежал в папке с индикаторами и советник его видел. Чтобы проверить все это мне и нужны скрины. А не видя того, что у вас в терминале невозможно устранить ошибку.

Для вставки картинки см. project.opentraders.ru/862.html
avatar

AM2

  • 16 сентября 2015, 18:17
0
Сейчас если высота меньше MinDeltaPoint и больше MaxDeltaPoint, ордера не откроются.
www.opentraders.ru/downloads/869/

avatar

AM2

  • 16 сентября 2015, 18:07
0
Советник видит индикатор? Дайте мне скрин с графика?
avatar

AM2

  • 16 сентября 2015, 17:40