Первый советник. Вопрос.

 

Добрый день.

Изучаю программирование МТ на практике написания первого простого советника.

Условие для продажи простые:

Если день завершился черной свечкой(снижение), то продаем....

extern double TakeProfit =50;
extern double StopLoss = 50;
extern double Lots=0.1;
double Points; // глобальная переменная
...
int init()
{Points=MarketInfo(Symbol(), MODE_POINT);  return(0);}
...
int start()
  { 
     if (Close[1]<Open[1]) //Если прошлая свеча черная, то продаем...
      {
      OrderSend(Symbol(),OP_SELL, Lots, Bid, 3, Bid+StopLoss*Points, Bid-TakeProfit*Points, 0, 0, Red); // открытие короткой позиции
      if (GetLastError()==0) Print("Цена продажи = ", OrderOpenPrice());
      return(0);//выходим      
      }
   return(0);
  }

При тестировании в журнале ошибка ...OrderSend error 4111

С уважением....

 
mdbm писал (а) >>

Добрый день.

Изучаю программирование МТ на практике написания первого простого советника.

Условие для продажи простые:

Если день завершился черной свечкой(снижение), то продаем....

Во первых несоответствие кода условию, ну да ладно.

Еще как минимум 2 ошибки и отсутствие контроля баров.

Надеюсь, разберетесь сами.

ERROR_SHORTS_NOT_ALLOWED 4111

Короткие позиции не разрешены. Необходимо проверить свойства эксперта.

 
TheXpert писал (а) >>

Во первых несоответствие кода условию, ну да ладно.

Еще как минимум 2 ошибки и отсутствие контроля баров.

Надеюсь, разберетесь сами.

ERROR_SHORTS_NOT_ALLOWED 4111

Короткие позиции не разрешены. Необходимо проверить свойства эксперта.

Все, вроде разобрался...

Контроль баров есть, просто решил сократить код для вопроса сюда...

А вот что касается:

...несоответствие кода условию

то можно поконкретнее пожалуйста...

это очень важно...


(Close[1]<Open[1])  - в этом месте ?
 

Проанализировав результат тестера:


Как сделать так: каждый день (дневные свечки) совершалась только одна операция

И совершалась она так: Если день закончился черной свечкой, то при начале новой свечки ПРОДАТЬ

далее, поза закрывается либо ТП либо Стопом в течении дня...и советник спит до окончания дня

и снова....Если день закончился черной свечкой, то при начале новой свечки ПРОДАТЬ...и т.д.

 
Мне кажется предпочтительнее использовать iOpen() и  iClose(), просто тогда условие "Если день завершился черной свечкой(снижение)" будет четче и однозначнее, а то день может закончится минутной черной свечкой и четырехчасовой белой.
 
   if (iClose(Symbol(),PERIOD_D1,1)<iOpen(Symbol(),PERIOD_D1,1)) //Если прошлая свеча черная, то...
      
      OrderSend(Symbol(),OP_SELL, Lots, Bid, 10, Bid+StopLoss*Points, Bid-TakeProfit*Points, 0, 0, Red);

Так ?

Вопрос: а как сделать, чтоб советник совершал только одну сделку в день ?

т.е. если поза закрылась стопом или профитом, советник должен молчать и ждать окончания дня....


Правильно ли будет использовать переменную, в которой будет храниться 1 или 0, где

1 - сделка уже была;

0 - сделка еще не совершалась;

Но как советник будет знать, что начался новый день, чтобы обнулить эту переменную ?

 
mdbm писал (а) >>

Вопрос: а как сделать, чтоб советник совершал только одну сделку в день ?

т.е. если поза закрылась стопом или профитом, советник должен молчать и ждать окончания дня....

Вот можно использовать что:
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает номер бара открытия последней позиции или -1.       |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    op - операция                   (   -1       - любая позиция)           |
//|    mn - MagicNumber                (   -1       - любой магик)             |
//+----------------------------------------------------------------------------+
int NumberOfBarOpenLastPos(string sy="0", int tf=0, int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=0; i<k; i++)                                    {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()==sy)                             {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op)                   {
            if (mn<0 || OrderMagicNumber()==mn)          {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }} } } } }
  return(iBarShift(sy, tf, t, True));
}

Тогда в условия входа нужно вставть

if (!NumberOfBarOpenLastPos(NULL, 0,-1, Magic)  ==0) {//запрет неск. сделок на текущ. баре
.... ... ..... .............................
                                                      }
 
rid писал (а) >>
Вот можно использовать что:

Тогда в условия входа нужно вставть

Лучше уж так:

if (NumberOfBarOpenLastPos(NULL, 0,-1, Magic) != 0) {//запрет неск. сделок на текущ. баре
.... ... ..... .............................
                                                      }
 
TheXpert писал (а) >>

Лучше уж так:

Что в лоб, что по лбу....

 

Интересная функция. 

Попробую....

 

________________

if (NumberOfBarOpenLastPos(NULL, 1440,-1, Magic) != 0) {//запрет более 1 сделки на день
Причина обращения: