0
Не дописал в настройках:
<code>extern double LOSS         = 20;   // Убыток в валюте депозита</code>
avatar

ssg

  • 8 мая 2021, 21:33
+1
Что бы не отвлекать Андрея.
В настройки добавить
extern bool Del          = false;    // закрывать позиции при пересечении

В функции заменить
if(CountTrades()<1)
     {
      if(Del)DelOrder();

      if(buy)
         PutOrder(0,Ask,Lot);

      if(sell)
         PutOrder(1,Bid,Lot);
     }

Тогда можно будет закрывать или не закрывать по желанию.
avatar

ssg

  • 20 апреля 2021, 06:04
0
Шаман, привет.
Но график и таблицу человек же откуда то взял? Или сам в поинте поигрался?
Не обвиняю человека, только рассуждаю.
avatar

ssg

  • 5 марта 2021, 12:04
0
Что то последняя строка таблицы и график не сходятся?! Откуда данные? Без источника это «панама».Или это вброс спама либерастов-демокрастов или адептов пассивного ЛГБТешника Навального? Что в принципе одно и тоже!!!
Но если общая динамика такова, то печально.
avatar

ssg

  • 4 марта 2021, 05:57
0
При Вашей записи читается:
пробегаем по всем ордерам в цикле с нашим магиком и нашим символом
и если (ТИП ОРДЕРА БАЙЛИМИТ И ТИП ОРДЕРА БАЙЛИМИТ) ТОГДА УДАЛЯЕМ ЕГО.
Андрей многое брал не один год с сайта www.mql5.com/ru/articles с форума этого сайта и базы кодов этого сайта.А так же сам добавлял базу своими работами, например:
https://www.mql5.com/ru/code/166

Советник «Боллинджер на стероидах» — эксперт для MetaTrader 5
Andrey Kornishkin | Russian

Просмотров:
14479
Рейтинг:
голосов: 62
Опубликован:
2010.08.12 17:20
Обновлен:
2016.11.22 07:33
bolbands.mq5 (14.02 KB) просмотр
Почитайте, может и для Вас найдется новая информация.
Или Вы обиделись, что деньги прошли мимо??
Так деньги нужно зарабатывать, а Вы хотели «навариться» на элементарной просьбе о помощи.Тем более что услуга то пустяковая.
А почему в записи if(OrderType()==-1)присутствует -1 сами почитайте документацию.
avatar

ssg

  • 21 февраля 2021, 13:30
0
Это Вам тип ордера должен???
Типы торговых операций

Тип операции в функции OrderSend() может быть указан в виде предопределённой константы или её значения и в соответствии с типом торговой операции:

Константа	Значение	Торговая операция
OP_BUY	0	Покупка
OP_SELL	1	Продажа
OP_BUYLIMIT	2	Отложенный ордер BUY LIMIT
OP_SELLLIMIT	3	Отложенный ордер SELL LIMIT
OP_BUYSTOP	4	Отложенный ордер BUY STOP
OP_SELLSTOP	5	Отложенный ордер SELL STOP

Почитайте опять учебник.https://book.mql4.com/ru/appendix/trading
avatar

ssg

  • 21 февраля 2021, 13:13
0
Собрал советник-полуавтомат по ТЗ на функциях Андрея (для лучшего понимания кода, дольше выискивал нужные функции<img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/002.gif' alt=' :) '>&nbsp; '>&nbsp; <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/017.gif' alt=' <img src='http://opentraders.ru/templates/skin/g6h/images/smilies/017.gif' alt=' ;) '>&nbsp; '>&nbsp; .
<code>//+------------------------------------------------------------------+
//|           Простой советник-полуавтомат позиция и стор ордера.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, AM2"
#property link      "http://www.forexsystems.biz"
#property version   "1.00"
#property strict
//--- Inputs
extern double Lots       = 0.1;      // лот
extern double KLots      = 2;        // увеличение лота
extern double Profit     = 5;        // прибыль
extern int StopLoss      = 0;        // лось
extern int TakeProfit    = 0;        // язь
extern int DistStop      = 100;       // расстояние до стопордера
extern int Slip          = 30;       // реквот
extern int Magic         = 0;        // магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   PutButton("B",100,120,"BUY");
   PutButton("S",100,80,"SELL");
   PutButton("C",100,40,"CLOSE");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   ObjectDelete(0,"B");
   ObjectDelete(0,"S");
   ObjectDelete(0,"C");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutButton(string name,int x,int y,string text)
  {
   ObjectCreate(0,name,OBJ_BUTTON,0,0,0);
//--- установим координаты кнопки
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,y);
//--- установим размер кнопки
   ObjectSetInteger(0,name,OBJPROP_XSIZE,80);
   ObjectSetInteger(0,name,OBJPROP_YSIZE,30);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,name,OBJPROP_CORNER,3);
//--- установим текст
   ObjectSetString(0,name,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,name,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,12);
//--- установим цвет текста
   ObjectSetInteger(0,name,OBJPROP_COLOR,Red);
//--- установим цвет фона
   ObjectSetInteger(0,name,OBJPROP_BGCOLOR,White);
//--- установим цвет границы
   ObjectSetInteger(0,name,OBJPROP_BORDER_COLOR,Blue);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(0,name,OBJPROP_HIDDEN,false);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger(0,name,OBJPROP_ZORDER,0);
  }
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1){
   bool cl;
   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()==-1)
              {RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),Slip,White);
              }
            if(OrderType()==OP_SELL || OrderType()==-1)
              {RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),Slip,White);
              }             
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Закрытие позиции по типу ордера                                  |
//+------------------------------------------------------------------+
void DeleteAll(int ot=-1){
   bool cl;
   for(int i=OrdersTotal()-1; i>=0; i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){           
              if(OrderType()==OP_BUYLIMIT){RefreshRates();cl=OrderDelete(OrderTicket());}
              if(OrderType()==OP_SELLLIMIT){RefreshRates();cl=OrderDelete(OrderTicket());}
              if(OrderType()==OP_BUYSTOP){RefreshRates();cl=OrderDelete(OrderTicket());}
              if(OrderType()==OP_SELLSTOP){RefreshRates();cl=OrderDelete(OrderTicket());}
             if(OrderType()==-1){RefreshRates();cl=OrderDelete(OrderTicket());}
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//| Профит всех ордеров по типу ордера                               |
//+------------------------------------------------------------------+
double LastProfit(int ot=-1){
   double pr=0;
   for(int i=OrdersTotal()-1; i>=0; i--){
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){
            if(OrderType()==0 || OrderType()==-1){pr+=OrderProfit()+OrderCommission()+OrderSwap();}
            if(OrderType()==1 || OrderType()==-1){pr+=OrderProfit()+OrderCommission()+OrderSwap();}
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick(){ 
  
 if(LastProfit(0)>Profit){CloseAll(0);DeleteAll(2);DeleteAll(4);}
 if(LastProfit(1)>Profit){CloseAll(1);DeleteAll(3);DeleteAll(5);}
 if(LastProfit()>Profit){CloseAll();DeleteAll();}
 
   if(ObjectGetInteger(0,"B",OBJPROP_STATE)==1)
     {
      PutOrder(0,Ask,Lots);
      PutOrder(4,Ask+DistStop*_Point,Lots*KLots);//Режим доливка.Ставим от открытого ордер на расстоянии х пунктов ордер в эту же сторону с лотом, увеличенным в х раз. 
      PutOrder(5,Bid-DistStop*_Point,Lots*KLots);//Режим страховка.Ставим от открытого ордер на расстоянии х пунктов ордер в противоположную сторону с лотом, увеличенным в х раз.
      ObjectSetInteger(0,"B",OBJPROP_STATE,false);
     }
   if(ObjectGetInteger(0,"S",OBJPROP_STATE)==1)
     {
      PutOrder(1,Bid,Lots);
      PutOrder(5,Bid-DistStop*_Point,Lots*KLots);//Режим доливка.Ставим от открытого ордер на расстоянии х пунктов ордер в эту же сторону с лотом, увеличенным в х раз. 
      PutOrder(4,Ask+DistStop*_Point,Lots*KLots);//Режим страховка.Ставим от открытого ордер на расстоянии х пунктов ордер в противоположную сторону с лотом, увеличенным в х раз.
      ObjectSetInteger(0,"S",OBJPROP_STATE,false);
     }
   if(OrdersTotal()>0 && ObjectGetInteger(0,"C",OBJPROP_STATE)==1)
     {
      CloseAll();
      DeleteAll();
      ObjectSetInteger(0,"C",OBJPROP_STATE,false);
     }
   Comment("\n Last Profit: ",LastProfit());
  }
//+------------------------------------------------------------------+
</code>
avatar

ssg

  • 21 февраля 2021, 07:18
0
Спасибо, Андрей при такой записи условие выполняется.
Для лучшего быстродействия у себя записал так:
<code>

//---------------------
// получили убыток 
if(LastDealResult()==2)
  {
// получили убыток по бай, закрыли баи
   if(LastDealType()==0)
     {
      b=0;
      s=1;
     }
// получили убыток по селам, закрыли селы
   if(LastDealType()==1)
     {
      s=0;
      b=1;
     }
  }
 else// получили прибыль , открыли все
   {
      b=1;
      s=1;
   }
//-----------------------------
</code>
avatar

ssg

  • 12 февраля 2021, 20:18
0
Андрей, добрый вечер.
Спасибо за оперативность.
В советнике при тестировании, с включенной визуализацией и на малой скорости, видно, что не соблюдается следующее условие указанное в ТЗ (цитирую):
-В случае положительного исхода сделки отрабатывается тот сигнал который подает индикатор.Это могут быть и покупки и продажи.
В таком случае алгоритм должен быть таким
/*
1. получили убыток
2. смотрим направление сделки
3. блокируем например покупки, оставляем только продажи
4.в случае получения профита от продажи, следующая сделка может быть
ЛЮБАЯ исходя из сигнала индикатора

5. получили убыток по продажам, открываем баи
*/
Прошу добавить в советник это условие.
avatar

ssg

  • 11 февраля 2021, 23:35
0
После стоп лосса не входим в этом же направлении. Ждём противоположного сигнала от индикатора и вход только по нему. После прибыльных сделок входим на любом следующем сигнале. Таким образом отсеиваем сильное движение с несколькими ложными сигналами, когда цена прилипает к одному из каналов индикатора.
На скриншоте сигналы. Два сигнала с профитом и один убыточный. Самое важное-после убыточной сделки не входим по новому сигналу в том же направлении. Дело в том, что при достаточно хорошем продолжительном движении в одном направлении цена будет крутиться на одном из уровней индикатора и давать постоянно кучу ложных входов, как например на скриншоте после третьей убыточной сделки. Ждём противоположного сигнала и будем входить только при противоположном сигнале.
avatar

ssg

  • 11 февраля 2021, 16:26
0
Добрый вечер, Андрей.
посмотрите
forexdengi.com/threads/147163-razgoni.-uchimsya-zarabativat-s-malenkimi-depozitami/page57

сообщения №1142 и №1144
avatar

ssg

  • 10 февраля 2021, 21:47
0
//+----------------------------------------------------------------------------+
//| e-CloseByLPInCurrency.mq4 |
//| |
//| Программирование: Ким Игорь В. aka KimIV [http://www.kimiv.ru] |
//| |
//| 03.07.2013 Советник закрывает все позиции при достижении заданного |
//| общего уровня убытка или профита в валюте депозита. |
//| Позиции можно фильтровать по символу, типу и магику. |
//+----------------------------------------------------------------------------+
avatar

ssg

  • 4 февраля 2021, 16:44
0
Спасибо, Андрей.:) 
avatar

ssg

  • 2 февраля 2021, 20:11
0
И еще надо договориться с брокером, что бы он не смел применять проскальзывания и реквоты!!!*evil* 
avatar

ssg

  • 1 февраля 2021, 08:06
0
Найдите отличие:

Пример:
Вручную ставится Buy Limit по цене 1.2100 и TP 1.2110
После закрытия, перевыставить Buy Limit по цене 1.2100 и TP 1.2110 (по какой цене его бы не открыл рынок).
После закрытия, СНОВА перевыставить Buy Limit по цене 1.2100 и TP 1.2110, и т.д.

Пример работы.
Отрыта позиция 1,1234 после ее закрытия по профиту на цену 1,1234 встанет лимитный ордер с теми же параметрами.
avatar

ssg

  • 1 февраля 2021, 02:59
0
www.mql5.com/ru/code/26031
Советник открывает лимитный ордер на месте только что закрытого прибыльного ордера.
Все параметры, лот SL, TP и направление идентичны закрытому.

В параметрах:

TimeStart = D’2019.07.14 00:00′;//время с которого контролируем закрытые сделки. (сделки закрытые ранее не будут учитываться советником)
delta = 5;//допустимое смещение сделок (при смещении отложенного ордера на несколько пунктов повторный ордер не выставлять)

Пример работы.
Отрыта позиция 1,1234 после ее закрытия по профиту на цену 1,1234 встанет лимитный ордер с теми же параметрами.
Если позиция закроется в убыток, то советник не будет открывать ордера.
В тестере советник открывает два ордера buy и sell для того, чтобы можно было наглядно увидеть его работу.
avatar

ssg

  • 31 января 2021, 23:51
0
Честно говоря, я уже и не помню.Давно читал эти статьи.Надо перечитывать.
Наверняка нет.
avatar

ssg

  • 29 января 2021, 20:17
0
Конкретно в этом случае можно попробовать так:
3) Делим результат 0,76965529 / 24 = 0,0/32/0689704166667
и считать как
int Result = 0,76965529 / 24*1000 = 0,0/32/0689704166667*1000=32,…
или double result = NormalizeDouble(Result, 0)
Как то так.
Но это частный случай!
avatar

ssg

  • 8 января 2021, 05:50
0
Понял.
Андрей, спасибо за проделанную работу.
avatar

ssg

  • 6 января 2021, 05:28