Лента последних комментариев


0
Добрый день, а советник по новому Т.З. сделаете?
avatar

vladimir31

  • 21 января 2025, 13:12
0
Я имею ввиду в последующих конкурсах8-) 
Давать ссылку на ТОРик про инсайт.
Хочу просмотров))
Твой этот уже скоро перегонит по просмотрам:D 
avatar

DrugHemp2

  • 21 января 2025, 10:55
0
А для чего вам функция PutOrder? Советник Moving Average в тестере работает намного быстрее советников от АМ2.
Если любите играться с советниками в тестере, то пишите без функции PutOrder, то есть напрямую.
avatar

alex30774

  • 21 января 2025, 10:50
0
Функция открывающая и (или) выставляющая отложенные ордера довольно индивидуальна. И, в зависимости от контекста, может сильно отличаться своим функционалом. Кто-то сразу в функцию закладывает условия, при которой производятся те или иные действия. Кто-то сразу выставляет SL и ТР. Кто-то еще что-то.

Посему найти вариантов — немеряно. Но я считаю, что эта функция должна быть заточена исключительно для открытия и (или) высталения ордеров. Условия же, при которых… должны быть в теле в OnInit().
Счета ECN не допускают открытие ордеров сразу со SL и (или) ТР. Открыл — выставил. Поэтому, считаю правильным выставлять ограничения после открытия ордера ВСЕГДА. Это подойдет для любого случая. За что и будет отвечать отдельная функция. Например, PutSL_TP(). Возможен вариант работы и вовсе без ограничений сверху-снизу.
Возможен и вариант с виртуальными SL и ТР. Например, по касании соответствующей линии, или по какому либо индюку. Вариантов тоже тьма.
Но повторюсь: эта тьма желатена к прописке в основном теле OnInit().

Единственное, что всегда надо предусматривать, чтобы таки ордера выставлялись или открывались гарантированно.
А для этого неоходимо, чтобы все цены были нормализованны. Чтобы SL и ТР были на допустимом удалении. Чтобы денег хватало на открытие ордера.

Есть и другие «козни брокера». Их то и надо предусмотреть и преодолеть.

Но это попозже.

Продолжение следует.
avatar

kvashnin007

  • 21 января 2025, 10:13
0
можно считать разность между линиями например 100п
и входить по расположению их друг над другом.
avatar

AM2

  • 21 января 2025, 09:07
0
вход в сделку по цветам в момент сигнала
avatar

igrun

  • 20 января 2025, 23:52
0
См. Мой первый пост )

Отдавай.ех4 файл на тест
avatar

AM2

  • 20 января 2025, 23:34
0
Отдавай.ех4 файл на тест, с ограничением по времени.
А лучше «утром деньги — в обед стулья, в обед деньги — вечером стулья»)).
avatar

verta81

  • 20 января 2025, 23:22
0
в личке в сообщениях в самом верху
avatar

AM2

  • 20 января 2025, 18:00
0
Вы мне номер карты не скинули
avatar

Denis2134

  • 20 января 2025, 17:58
0
он поставил ордер через день пришёл ещё сигнал


о еще одно условие добавилось. а на карту ничего так и не капнуло (  *stesnitelno* 
avatar

AM2

  • 20 января 2025, 17:53
0
Правда как стрелочник он сливатор сразу, а мартин почему-то не работает, хотя и смысла в неём особого нет, у меня этого го… на валом(((
avatar

Alex125

  • 20 января 2025, 16:50
0
Я для уточнения пришёл Алерт евро доллар он поставил ордер через день пришёл ещё сигнал с такой-же валютной парой он предыдущий закрывает а этот сигнал открывает
avatar

Denis2134

  • 20 января 2025, 16:35
0
Согласен
avatar

Denis2134

  • 20 января 2025, 16:04
0
Ну да ладно.
Поведем караван.

Удобная штука: имеешь набор функций. Проверенных не раз. С всевозможными проверками, повторами, работой над ошибками. А в OnTick() точишь себе алгоритм. Если это, то выполняем ту-то функцию. Кроме того, что удобно, так и еще читаемость кода улучшается, а значит ошибок меньше и бороться с ними проще. Только есть несколько ТОЛЬКО.

Возьмем, например, всем вам до боли знакомую функцию Открытия рыночного и, для универсальности, выставления отложенных ордеров от АМ2:

<code>
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,double lot)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)
         sl=NormalizeDouble(price+StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price-TakeProfit*_Point,_Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)
         sl=NormalizeDouble(price-StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);
     }

   r=OrderSend(NULL,type,lot,NormalizeDouble(price,_Digits),Slip,sl,tp,Comm,Magic,0,clr);
   return;
  } 
//+------------------------------------------------------------------+
</code>


Обычная так себе функция. В чем универсальность? Да одна функция на все случаи жизни. Удобно таки.
Хочешь ордер по рынку — укажи тип 0 или 1, хочешь выставить отложку — 2,3,4 или 5, соответственно выбору.
Ах да, цену открытия надо выставлять. А какая она у единицы? Или нуля? А, не дай бог, и поболее. Тут надо напрячся. А почему не написать PutOrder (OP_BUY), вместо PutOrder (0)? Мало того, что красным цветом пойдет так и лишний раз и напрягаться не надо. Хотя это одна и таже команда. Ну Lot можно по-разному. Иногда проще в теле, а иногда лучше отдать его расчет отдельной функции. Часто, если алгоритм предполагает дележ ордеров на группы, указывают в скобках еще int magic.

Теперь — «обвязка» ордера. SL,TP, Slippage и т.д.

Тут тоже хватает нюансов.
Кто-то хочет, чтобы настройки советника были одинаковыми для четырех и пяти знаковых терминалов.
Поэтому _Point часто превращают в глобальную переменню double pnt, например. Для чего? Да просто: если пятизнак, то _Point увеличивают *10. А в связи с тем, что эта величина постоянная, pnt задают один раз в OnInit(). Плюс к этому, не надо будет каждый раз обращаться к терминалу с запросом величины Point(). Исходя из этих же соображений я бы ввел еще переменную string symbol. И один раз бы в OnInit() приравнял бы ее Symdol(). Аналогично и с _Digits.

Особое внимание надо обратить на SL и ТР. Первым делом, в связи с тем, что эти переменные не меняются по ходу работы советника, я бы ввел глобальные переменные _double sl, tp; по аналогии, о чем выше в OnInit() сразу один бы раз перевел в стоимост, избегая дальнейших лишних телодвижений. Т.е. в OnInit() sl=StopLoss*_Point и tp=TakeProfit*_Point. Аналогично можно поступить и с другими пунктовыми переменными, которые остаются неизменным по ходу работы советника. Например, Step, Trail, BU и т.д.

В связи с тем, что было выше писано, функция от Андрея должна выглядеть приблизительно ТАК:

<code>//+------------------------------------------------------------------+
//|                                                       Locker.mq4 |
//|                                              Copyright 2022, AM2 |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, AM2"
#property link      "https://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern int    StopLoss      = 23;        // лось   в пунктах
extern int    TakeProfit    = 78;        // язь    в пунктах
extern int    Slippage      = 3;         // реквот в пунктах

strig  symbol; 
int    digits, slippage;
double pnt,sl,tp;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
      symbol = Symbol(); 
      digits = Digits;
      pnt    = Point;
   
      if(digits==3 || digits==5)
        {
        tp       = TakeProfit*pnt*10;
        sl       = StopLoss*pnt*10;     
        slippage = Slippage*pnt*10;
        }
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Comment("");
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   if(CountTrades()==Count && !TimeSession(StartHour,StartMin,EndHour,EndMin,TimeCurrent()))
      {
      if(Sell)
         PutOrder(OP_BUY,Ask,Lot);
      if(Buy)
         PutOrder(OP_SELL,Bid,Lot);
      }
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price,double lot)
  {
   int r=0;
   color clr=Green;

   if(type==OP_SELL || type==OP_SELLLIMIT || type==OP_SELLSTOP)
     {
      clr=Red;
      if(StopLoss>0)
         sl=NormalizeDouble(price+sl,digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price-tp,digits);
     }

   if(type == OP_BUY || type == OP_BUYLIMIT || type==OP_BUYSTOP)
     {
      clr=Blue;
      if(StopLoss>0)
         sl=NormalizeDouble(price-sl,digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price+tp,digits);
     }

   r=OrderSend(NULL,type,lot,NormalizeDouble(price,digits),slippage,sl,tp,Comm,Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+</code>


В результате мы имеем функцию, для проверки идей в более удобоваримом виде и объективно, хоть не на много, но таки быстрее. Особенно важно при тестировании.

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

kvashnin007

  • 20 января 2025, 16:02
0
также будет по всем символам в окне рынка
avatar

AM2

  • 20 января 2025, 15:50