Ваши вопросы по языку MQL4

unikum22

Прохожий
Проблема с удвоением лота в советнике

Здравствуйте, уважаемые форумчане. Столкнулся с проблемой удвоения лота если последняя сделка сработала в минус. Почему-то лот удваивается по два раза подряд. Вот скрин из тестера:

Помогите пожалуйста разобраться. За ранее огромное спасибо!


1 2015.01.02 09:00 sell 1 0.10 1.2053 1.2103 1.2003 0.00 2000.00
2 2015.01.02 22:23 t/p 1 0.10 1.2003 1.2103 1.2003 0.50 2000.50
3 2015.01.02 22:23 sell 2 0.10 1.2001 1.2051 1.1951 0.00 2000.50
4 2015.01.05 00:00 t/p 2 0.10 1.1951 1.2051 1.1951 0.50 2001.00
5 2015.01.05 00:00 buy 3 0.10 1.1948 1.1898 1.1998 0.00 2001.00
6 2015.01.05 00:02 s/l 3 0.10 1.1898 1.1898 1.1998 -0.50 2000.50
7 2015.01.05 00:02 sell 4 0.10 1.1898 1.1948 1.1848 0.00 2000.50
8 2015.01.05 00:39 s/l 4 0.10 1.1948 1.1948 1.1848 -0.50 2000.00
9 2015.01.05 00:39 buy 5 0.20 1.1948 1.1898 1.1998 0.00 2000.00
10 2015.01.05 14:34 s/l 5 0.20 1.1898 1.1898 1.1998 -1.00 1999.00
11 2015.01.05 14:34 sell 6 0.20 1.1898 1.1948 1.1848 0.00 1999.00
12 2015.01.05 22:40 s/l 6 0.20 1.1948 1.1948 1.1848 -1.00 1998.00
13 2015.01.05 22:40 buy 7 0.40 1.1948 1.1898 1.1998 0.00 1998.00
14 2015.01.06 12:27 s/l 7 0.40 1.1898 1.1898 1.1998 -2.01 1995.99
15 2015.01.06 12:27 sell 8 0.40 1.1898 1.1948 1.1848 0.00 1995.99
16 2015.01.06 19:18 s/l 8 0.40 1.1948 1.1948 1.1848 -2.00 1993.99
17 2015.01.06 19:18 buy 9 0.80 1.1948 1.1898 1.1998 0.00 1993.99
18 2015.01.06 22:09 s/l 9 0.80 1.1898 1.1898 1.1998 -4.00 1989.99
19 2015.01.06 22:09 sell 10 0.80 1.1898 1.1948 1.1848 0.00 1989.99
20 2015.01.07 12:55 t/p 10 0.80 1.1848 1.1948 1.1848 4.01 1994.00
21 2015.01.07 12:55 sell 11 1.60 1.1846 1.1896 1.1796 0.00 1994.00
22 2015.01.08 10:58 t/p 11 1.60 1.1796 1.1896 1.1796 8.04 2002.03
23 2015.01.08 10:58 sell 12 0.10 1.1794 1.1844 1.1744 0.00 2002.03
24 2015.01.09 18:03 s/l 12 0.10 1.1844 1.1844 1.1744 -0.50 2001.53
25 2015.01.09 18:03 buy 13 0.10 1.1844 1.1794 1.1894 0.00 2001.53
26 2015.01.12 12:31 s/l 13 0.10 1.1794 1.1794 1.1894 -0.50 2001.03
27 2015.01.12 12:31 sell 14 0.20 1.1794 1.1844 1.1744 0.00 2001.03
28 2015.01.12 16:50 s/l 14 0.20 1.1844 1.1844 1.1744 -1.00 2000.03
29 2015.01.12 16:50 buy 15 0.20 1.1844 1.1794 1.1894 0.00 2000.03
30 2015.01.13 11:46 s/l 15 0.20 1.1794 1.1794 1.1894 -1.01 1999.03
31 2015.01.13 11:46 sell 16 0.40 1.1794 1.1844 1.1744 0.00 1999.03
32 2015.01.14 11:36 t/p 16 0.40 1.1744 1.1844 1.1744 2.00 2001.03
33 2015.01.14 11:36 sell 17 0.40 1.1742 1.1792 1.1692 0.00 2001.03
34 2015.01.14 15:30 s/l 17 0.40 1.1792 1.1792 1.1692 -2.00 1999.03
35 2015.01.14 15:30 buy 18 0.10 1.1792 1.1742 1.1842 0.00 1999.03
36 2015.01.14 15:51 t/p 18 0.10 1.1842 1.1742 1.1842 0.50 1999.53
37 2015.01.14 15:51 buy 19 0.80 1.1844 1.1794 1.1894 0.00 1999.53
38 2015.01.14 16:35 s/l 19 0.80 1.1794 1.1794 1.1894 -4.00 1995.53
39 2015.01.14 16:35 sell 20 0.10 1.1794 1.1844 1.1744 0.00 1995.53
40 2015.01.14 23:59 close at stop 20 0.10 1.1790 1.1844 1.1744 0.04 1995.57





Код:
//+------------------------------------------------------------------+
//|                                                      Begemot.mq4 |
//|                                                        Begemot32 |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Begemot32"
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict


extern double Lot; 
double OrPrice;         
double OrLots;         
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {



   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---
   
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert start function                                             |
//+------------------------------------------------------------------+
int start()
{
  
  



 
  for(int i=0;i<OrdersTotal();i++)
   {
   if (OrderSelect(OrdersHistoryTotal()-1, SELECT_BY_POS, MODE_HISTORY)) // Выбираем последний ордер из истории.
     {
      OrPrice=OrderProfit(); //узнаем профит закрытого ордера
      OrLots=OrderLots();  //узнаем объем(лот)закрытого ордера
     }
   }
if(OrPrice<0) {           //если профит меньше нуля (отрицательный показатель) то..
 Lot=OrLots*2;       // ...умножаем лот на 2
         
 
 

                 if(OrdersTotal() == 0 && Open[0]<Close[0] && Close[0]==High[0]) // если нет ордеров и восходящая свеча то..
                   {
                   OrderSend(Symbol(), OP_BUY, Lot, Ask, 3, Ask-50*Point, Ask+50*Point); // открываем ордер на БАЙ с удвоенным лотом
                   }
                 else

                 
                 
                 
                if(OrdersTotal() == 0 && Open[0]>Close[0] && Close[0]==Low[0]) // если нет ордеров и нисходящая свеча то..
                  {
                  OrderSend(Symbol(), OP_SELL, Lot, Bid, 3, Bid+50*Point, Bid-50*Point); // открываем ордер на СЕЛЛ с удвоенным лотом
                  }
                else
                Print("ORDER NE USTANOVLEN!!!");
 
 }
 else // если последний ордер закрылся с положительным результатом (цена больше или равна нулю)то..




                 //ОТКРЫТИЕ ОРДЕРА НА ПОКУПКУ
                 if(OrdersTotal() == 0 && Open[0]<Close[0] && Close[0]==High[0]) // если нет ордеров и восходящая свеча то..
                   {
                   OrderSend(Symbol(), OP_BUY, 0.1, Ask, 3, Ask-50*Point, Ask+50*Point); // открываем ордер на БАЙ
                   }
                 else
                 Print("BUY - ORDER NE USTANOVLEN!!!");
                                      




                //ОТКРЫТИЕ ОРДЕРА НА ПРОДАЖУ                      
                if(OrdersTotal() == 0 && Open[0]>Close[0] && Close[0]==Low[0]) // если нет ордеров и нисходящая свеча то..
                  {
                  OrderSend(Symbol(), OP_SELL, 0.1, Bid, 3, Bid+50*Point, Bid-50*Point); // открываем ордер на СЕЛЛ
                  }
                else
                Print("ORDER NE USTANOVLEN!!!");












  
  
   return(0);
}
 
Последнее редактирование модератором:

Rattnik

Прохожий
Всем здравствуйте.

Для тестировании стратегии на H1 необходимо получать данные о закрытии предыдущего дня.

В Индикаторе пишу следующее (соответственно предварительно объявив "CloseLine" в OnInit()) :


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[])
{
Close_Day=iClose("EURUSD",PERIOD_D1,1);
ObjectSet("CloseLine",OBJPROP_PRICE1,Close_Day);

return(rates_total);
}

В результате цена с ТФ Day не изменяется, и линия не перестраивается.
Помогите пожалуйста.

Спасибо
 

vladradon

Программист
Добрый день!
Подкиньте, пожалуйста, кусок кода для закрытия всех ордеров при общем убытке X пунктов или X% от депозита.
http://fxgeneral.com/forum/topic/779-советники-мартингейл-на-основе-перцептрона-tdi-с/
Посмотри, если не поленишься, мои разработки со старого форума - там есть тот код, который тебе нужен...
Если возникнут вопросы - чиркани и я постараюсь максимально быстро проанализировать и ответить.
 

millioner8585

Прохожий
Как выловить сигнал стрелку из индикатора для советника

Подскажите как вытащить появление стрелочки на предыдущем баре из индикатора во вложении. По ним хочу открывать и закрывать позиции при добавлении фильтров...
Буду ОЧЕНЬ благодарен за помощь. На форуме новенький, если нужно писать в другую ветку, извините....
Посмотреть вложение #Forexsignal30_01.ex4
 

mobidik

-----
Подскажите как вытащить появление стрелочки на предыдущем баре из индикатора во вложении. По ним хочу открывать и закрывать позиции при добавлении фильтров...
Буду ОЧЕНЬ благодарен за помощь. На форуме новенький, если нужно писать в другую ветку, извините....
Посмотреть вложение 213570

PHP:
 double RedArr = iCustom(Symbol(),0,"#Forexsignal30_01",RISK,CountBars,SoundON,EmailON,0,1);  //сигнал от красной стрелки
 double GreenArr = iCustom(Symbol(),0,"#Forexsignal30_01",RISK,CountBars,SoundON,EmailON,1,1);//сигнал от зеленой стрелки
 

millioner8585

Прохожий
Спасибо огромное.
Для новичком напишу, что само появление стрелочки (например зеленой) прописывается так:
PHP:
GreenArr!=0 && GreenArr!=EMPTY_VALUE
 

millioner8585

Прохожий
Подскажите пож-та.
пишу советник для полуавтоматической торговли...
НА демке нет пока возможности проверить.
Будет ли этот советник закрывать сделки при появлении стрелки.
При компиляции ошибка "event handling function not found", но как я понял это ошибка означает что нет открытия позиции, но я планирую ручками открывать, и автоматом (советником) закрывать.
Заранее Спасибо!
PHP:
//--- Inputs
extern double RISK =  5;
extern double CountBars =  500;
extern double SoundON =  0;
extern double EmailON =  0;

//+------------------------------------------------------------------+
//| Calculate open positions                                         |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;
//---
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol())
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
//--- return orders volume
   if(buys>0) return(buys);
   else       return(-sells);
  }
//+------------------------------------------------------------------+
//| Check for close order conditions                                 |
//+------------------------------------------------------------------+
void CheckForClose()
  {
double RedArr;  //сигнал от красной стрелки 
double GreenArr; //сигнал от зеленой стрелки 
//--- go trading only for first tiks of new bar
   if(Volume[0]>1) return;
//--- Берем стрелки 
RedArr = iCustom(Symbol(),0,"#Forexsignal30_01",RISK,CountBars,SoundON,EmailON,0,1);
GreenArr = iCustom(Symbol(),0,"#Forexsignal30_01",RISK,CountBars,SoundON,EmailON,1,1);
//---
   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      
      //--- check order type 
      if(OrderType()==OP_BUY)
        {
         if(RedArr!=0 && RedArr!=EMPTY_VALUE)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
      if(OrderType()==OP_SELL)
        {
         if(GreenArr!=0 && GreenArr!=EMPTY_VALUE)
           {
            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))
               Print("OrderClose error ",GetLastError());
           }
         break;
        }
     }
//---
  }
 

Ugar

Гуру форума
Подскажите пож-та.
пишу советник для полуавтоматической торговли...
НА демке нет пока возможности проверить.
Будет ли этот советник закрывать сделки при появлении стрелки.
При компиляции ошибка "event handling function not found", но как я понял это ошибка означает что нет открытия позиции, но я планирую ручками открывать, и автоматом (советником) закрывать.
Заранее Спасибо!
Не будет вообще работать. Где функция OnTick() или OnTimer()?
Накидал пользовательских функций, а вызывать то кто их будет?
 

_SERG_

Активный участник
Чё себе приключения придумывать?!!!
..."event handling function not found", но как я понял это ошибка означает что нет открытия позиции, ...
а на самом деле:
....Добавлена ошибка компиляции "event handling function not found" при отсутствии в программе точек входа (OnStart, OnTick и т.д.)....

Не правильное понимание - неправильный результат.
Надо бы со структурой программ в MQL познакомиться.
 
Последнее редактирование:

ksardas

Гуру форума
Случайно попался не доработанный индюк, считает бычьи и медвежьи свечи
но не обновляется, что нужно поправить???
PHP:
//+------------------------------------------------------------------+
//|                                                Copyright © 2010  |
//|                                                  indikator MA.mq4|
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009. All rights reserved."
#property link "[email protected]"

#property indicator_separate_window

#property indicator_buffers 5
#property indicator_color1 Orange 


extern int bar = 1000;// количество кирпичей РЕНКО для отображения линии
extern int Sum = 34; // суммируемое количество последних баров, от 1 до Sum=34 

double line[];

int i,limit,sum; 
//========================================================
int init() {
   IndicatorBuffers(1);

   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexBuffer(0, line);

   IndicatorDigits(Digits); 
   
IndicatorShortName("indikator MA");

return(0);
}

int deinit()
{

return(0);
}

//====================================================================
int start() {   
      limit = bar - IndicatorCounted(); 
      i = limit;

//РИСУЕМ ГРАФИК
//--------------------------------------------------------------------
   while(i>=0)
{  
sum=0;
   for(int t = Sum; t > 0; t--){
if(Open[i+t-1]-Close[i+t-1]>0)sum=sum-1; else sum=sum+1;
}

       line[i] = sum;
        i--;
}
//--------------------------------------------------------------------
   return(0);
}
//+------------------------------------------------------------------+
 

mobidik

-----
Случайно попался не доработанный индюк, считает бычьи и медвежьи свечи
но не обновляется, что нужно поправить???
PHP:
//+------------------------------------------------------------------+
//|                                                Copyright © 2010  |
//|                                                  indikator MA.mq4|
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009. All rights reserved."
#property link "[email protected]"

#property indicator_separate_window

#property indicator_buffers 5
#property indicator_color1 Orange 


extern int bar = 1000;// количество кирпичей РЕНКО для отображения линии
extern int Sum = 34; // суммируемое количество последних баров, от 1 до Sum=34 

double line[];

int i,limit,sum; 
//========================================================
int init() {
   IndicatorBuffers(1);

   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexBuffer(0, line);

   IndicatorDigits(Digits); 
   
IndicatorShortName("indikator MA");

return(0);
}

int deinit()
{

return(0);
}

//====================================================================
int start() {   
      limit = bar - IndicatorCounted(); 
      i = limit;

//РИСУЕМ ГРАФИК
//--------------------------------------------------------------------
   while(i>=0)
{  
sum=0;
   for(int t = Sum; t > 0; t--){
if(Open[i+t-1]-Close[i+t-1]>0)sum=sum-1; else sum=sum+1;
}

       line[i] = sum;
        i--;
}
//--------------------------------------------------------------------
   return(0);
}
//+------------------------------------------------------------------+

Если нужна вся история, сделай так: в строке
PHP:
 limit = bar - IndicatorCounted();
замени bar на Bars, если нужно ограничение по истории, замени на:
PHP:
 limit = MathMin(Bars - IndicatorCounted(),bar);
 

millioner8585

Прохожий
Скажите как прописать:
За последние 10 баров одно из значений 0-го буфера стохастика было больше 80.
Спасибо.
 

Saigon

Активный участник
ПОМОГИТЕ ПОЖАЛУЙСТА НАПИСАТЬ ВОТ ТАКОЙ ИНДИКАТОР ИСОИ (Импульс Силы Открытого Интереса):

Что бы высчитать ИСОИ – можно использовать любое кол-во баров но не меньше 3х….
Коэффициент ИСОИ со знаком «-« - интерес в шорт
Коэффициент ИСОИ со знаком «+« - интерес в лонг
ИСОИ
от 0 до +\- 0.5 слабый импульс
от +\- 0.5 до +\- 1.0 сильный импульс
Возьмем к примеру 5 баров.
Теперь суммируем объем (V) – 21597
Суммируем время (Т) -23089 или 6.41 часа
Суммируем Дельту со знаком (D) - +639
Суммируем цену в пунктах (минимальная и максимальная цена за 5 баров) (Р) – 25 пунктов.
1. Вычисляем коэффициент диапазона
Т \ Р = K
6.41 \ 25 = 0.23
2. Вычисляем соотношение Дельты
D x 100% \ V = G
+639 х 100% \ 21597 = 2.96%
2. Вычисляем ИСОИ
K x G = ИСОИ
0.23 х 2.96 = 0.68
Или 68% - импульс Открытого Интереса – сильный…
 

AlexeyVik

Программист mql4 mql5
ПОМОГИТЕ ПОЖАЛУЙСТА НАПИСАТЬ ВОТ ТАКОЙ ИНДИКАТОР ИСОИ (Импульс Силы Открытого Интереса):

Что бы высчитать ИСОИ – можно использовать любое кол-во баров но не меньше 3х….
Коэффициент ИСОИ со знаком «-« - интерес в шорт
Коэффициент ИСОИ со знаком «+« - интерес в лонг
ИСОИ
от 0 до +\- 0.5 слабый импульс
от +\- 0.5 до +\- 1.0 сильный импульс
Возьмем к примеру 5 баров.
Теперь суммируем объем (V) – 21597
Суммируем время (Т) -23089 или 6.41 часа
Суммируем Дельту со знаком (D) - +639
Суммируем цену в пунктах (минимальная и максимальная цена за 5 баров) (Р) – 25 пунктов.
1. Вычисляем коэффициент диапазона
Т \ Р = K
6.41 \ 25 = 0.23
2. Вычисляем соотношение Дельты
D x 100% \ V = G
+639 х 100% \ 21597 = 2.96%
2. Вычисляем ИСОИ
K x G = ИСОИ
0.23 х 2.96 = 0.68
Или 68% - импульс Открытого Интереса – сильный…
А как у тебя получилось за 5 баров больше шести часов?
Если Н1 то не больше пяти часов, а если Н4 то гораздо больше...
А в общем-то эффективность метода надо проверять. Но у меня сейчас нет времени этим заниматься.
 

Viko2000

Почетный гражданин
Коллеги перезагрузка.)*hi* Вопрос к профи.

Есть идея с изменением процента закрытия дальнего с изменением просадки по Эквити.
А именно условие. Внешние переменные и условие. Сообразил так.

PHP:
extern double CloseProfitprc  = 1;     //закрывать по суммарному проц

extern double PercentLossCloseProfitprc1 = 1;
extern double PercentLossCloseProfitprc2 = 5;
extern double PercentLossCloseProfitprc3 = 10;
extern double PercentLossCloseProfitprc4 = 20;
   
int start3()
{ 
  if (AccountEquity()<=AccountBalance()*(1-PercentLossCloseProfitprc1  /100)) {CloseProfitprc=1;}
    else 
  if (AccountEquity()<=AccountBalance()*(1-PercentLossCloseProfitprc2  /100)) {CloseProfitprc=0.5;}
    else
  if (AccountEquity()<=AccountBalance()*(1-PercentLossCloseProfitprc3  /100)) {CloseProfitprc=0.1;}
    else
  if (AccountEquity()<=AccountBalance()*(1-PercentLossCloseProfitprc4  /100)) {CloseProfitprc=0.01;}     
//////////////////////////////////////

   return(0);
  }

Работать будет.? Что я пока не врубаюсь. Может без else?
 
Верх