Господа программисты помогите пожалуйста!!!

 

Идея проста! мувинги вниз Селл, вверх Бай. В рынке один ордер. Если последний был Бай то Будем открывать только Селл, Если же последний был Селл тогда только Бай! тестил по Тестеру ни одной не открыл. Идея хорошая!


Помогите пожалйуста узнать где ошибка! (мой первый МТС)!


//+------------------------------------------------------------------+
//| E_MA_5-10-20.mq4 |
//| |
//| |
//+------------------------------------------------------------------+
#property copyright "Hometrader"

extern int TakeProfit = 2;
extern int Slippage = 3;
extern int Limit = 30;
extern int Contract = 1;

double EMA_1_5;
double EMA_1_10;
double EMA_1_20;

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
Alert ("Сработала ф-ия init() при запуске"); // Сообщение
return; // Выход из init()
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
Alert ("Сработала ф-ия deinit() при выгрузке"); // Сообщение
return; // Выход из deinit()
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
int i;
int m =-1;
i = HistoryTotal()-1; // Определяем номер в списке последнего закрытого ордера
OrderSelect(i,SELECT_BY_POS,MODE_HISTORY); // Выбираем этот ордер среди закрытых и удаленных
m=OrderType(); // Определяем его тип

// if(i==0) Print("Последняя операция BUY");
// if(i==1) Print("Последняя операция SELL");


EMA_1_5 = iMA(NULL,1,5, 0, MODE_EMA, 0,0);
EMA_1_10 = iMA(NULL,1,10, 0, MODE_EMA, 0,0);
EMA_1_20 = iMA(NULL,1,20, 0, MODE_EMA, 0,0);

int total = OrdersTotal();

if (total < Contract)

{ //
if (EMA_1_5 > EMA_1_10 > EMA_1_20 && i==1)
{
OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,NULL,0,0,CLR_NONE);
Alert (GetLastError()); // Сообщение
}
//
if (EMA_1_20 > EMA_1_10 > EMA_1_5 && i==0)
{
OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,NULL,0,0,CLR_NONE);
Alert (GetLastError());

}
}

CloseAll();
return(0);}
//-----------------------------------------------------------------------------
void CloseAll()
{
for (int cnt = OrdersTotal()-1 ; cnt >= 0; cnt--)
{
OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
if (OrderSymbol() == Symbol())
{
if ((OrderProfit()>=TakeProfit))
{
if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);
if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);
}
else
{
if((OrderType()==OP_BUY) && (((OrderOpenPrice()-Ask)/Point) >= Limit)) //--
OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);
if((OrderType()==OP_SELL) && (((Bid-OrderOpenPrice())/Point) >= Limit))//---
OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);
}
}
}
}
Файлы:
 

Начал было вникать в код . Но там что то совсем странно задано определение типа посл. закрытой позиции.

К тому же, код нужно вставлять в сообщ. используя соотв. опцию в меню ответа.

Так что переделывайте сами.

А для определения типа посл. закрытой позиции можно использовать функцию

https://www.mql5.com/ru/forum/107476/page20

Функция GetTypeLastClosePos().

Эта функция возвращает тип последней закрытой позиции или -1. Более точный отбор учитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
  • //+----------------------------------------------------------------------------+
    //|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                   |
    //+----------------------------------------------------------------------------+
    //|  Версия   : 19.02.2008                                                     |
    //|  Описание : Возвращает тип последней закрытой позиции или -1               |
    //+----------------------------------------------------------------------------+
    //|  Параметры:                                                                |
    //|    sy - наименование инструмента   (""   - любой символ,                   |
    //|                                     NULL - текущий символ)                 |
    //|    mn - MagicNumber                (-1   - любой магик)                    |
    //+----------------------------------------------------------------------------+
    int GetTypeLastClosePos(string sy="", int mn=-1) {
      datetime t;
      int      i, k=OrdersHistoryTotal(), r=-1;
    
      if (sy=="0") sy=Symbol();
      for (i=0; i<k; i++) {
        if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
          if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
            if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                r=OrderType();
              }
            }
          }
        }
      }
      return(r);
    }

Например:

if ( GetTypeLastClosePos(NULL, -1)==OP_BUY ) {
//если посл. закр. позиция была - БАЙ 

Саму же функцию вставте в самый конец кода ( вне ф-и int start() ) .

 
rid писал(а) >>

Начал было вникать в код . Но там что то совсем странно задано определение типа посл. закрытой позиции.

К тому же, код нужно вставлять в сообщ. используя соотв. опцию в меню ответа.

Так что переделывайте сами.

А для определения типа посл. закрытой позиции можно использовать функцию

'Полезные функции от KimIV'

Функция GetTypeLastClosePos().

Эта функция возвращает тип последней закрытой позиции или -1. Более точный отбор учитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. NULL означает текущий инструмент.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.

Например:

Саму же функцию вставте в самый конец кода ( вне ф-и int start() ) .

Уважаемый РИД! Спасибо за код. Но если честно я ничего в нем не понял. Метаедитор не признает запись (GetTypeLastClosePos). Если это возможно, и если у Вас будет время, исправить Советник. Пожалуйста будьте так добры к начинающему Чайнику!!!

Если НЕТ! то и на этом спасибо!

 
Hometrader писал(а) >>

Уважаемый РИД! Спасибо за код. Но если честно я ничего в нем не понял. Метаедитор не признает запись (GetTypeLastClosePos). Если это возможно, и если у Вас будет время, исправить Советник. Пожалуйста будьте так добры к начинающему Чайнику!!!

Если НЕТ! то и на этом спасибо!

Немного изменил код, нужно обрабатывать условия для закрытия

Файлы:
 
Vinin писал(а) >>

Немного изменил код, нужно обрабатывать условия для закрытия

Спасибо Винил !!!

Большое Спасибо!

Причина обращения: