Jump to content
muvingman

Напишу советник, скрипт, индикатор на MQL бесплатно

Recommended Posts

Saler
6 часов назад, Ugar68 сказал:

В чём, в пунктах?

 

Хотелось бы в валюте депозита иметь такую информацию.

Share this post


Link to post
Share on other sites
ZeleBoba
10 часов назад, Saler сказал:

Приветствую, специалисты.

Насколько будет трудно написать индикатор, показывающий сумму заданных тейк-профитов по текущему инструменту + по всем открытым ордерам?

Спасибо.

вот что-то похожее писал для себя.

кидаем индюка на график.

Индюк создает на уровне текущей цены линию с текстовой меткой о суммарном профите.

двигаете эту линию на интересующий Вас уровень и увидите суммарный профит (или лосс) по всем открытым ордерам этого инструмента.

 

defProfit.mq4

defProfit.ex4

Edited by ZeleBoba
  • Upvote 1

Лучше маленький профит, чем большие рога.

Share this post


Link to post
Share on other sites
Saler
1 час назад, ZeleBoba сказал:

кидаем индюка на график.

 

Спасибо.

Глянул - вещь неплохая, можно пользоваться. 🙂

Но хотелось бы именно сумму тейков по инструменту и по всем ордерам видеть в одном месте. А тут придётся, во-первых, двигать чтобы увидеть цифру, во-вторых, сумму считать слишком муторно когда пар много используется, ну и у ордеров тейк может быть на разных уровнях.

Share this post


Link to post
Share on other sites
ZeleBoba
15 минут назад, Saler сказал:

 

Спасибо.

Глянул - вещь неплохая, можно пользоваться. 🙂

Но хотелось бы именно сумму тейков по инструменту и по всем ордерам видеть в одном месте. А тут придётся, во-первых, двигать чтобы увидеть цифру, во-вторых, сумму считать слишком муторно когда пар много используется, ну и у ордеров тейк может быть на разных уровнях.

чуток позже сварганю. Как поступать с ордерами, у которых ТР отсутствует? Игнорить?

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

Или всё же надо мониторить/пересчитытвать индюком? если Вы вдруг будете перетаскивать тейки и если влом повторно запустить скрипт?

 

  • Upvote 1

Лучше маленький профит, чем большие рога.

Share this post


Link to post
Share on other sites
Ugar68
12 часов назад, Saler сказал:

Приветствую, специалисты.

Насколько будет трудно написать индикатор, показывающий сумму заданных тейк-профитов по текущему инструменту + по всем открытым ордерам?

Спасибо.

 

4 часа назад, Saler сказал:

 

Хотелось бы в валюте депозита иметь такую информацию.

Вот как то так. Отображает в виде комментария.

 

TP_Profit_Sum.mq4

  • Upvote 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
Saler
34 минуты назад, ZeleBoba сказал:

Как поступать с ордерами, у которых ТР отсутствует? Игнорить?

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

Или всё же надо мониторить/пересчитытвать индюком? если Вы вдруг будете перетаскивать тейки и если влом повторно запустить скрипт?

 

Спасибо. Думаю, что можно игнорить отсутствующие тейки а новые ордера и тейки подсчитывать при запуске скрипта.

Хотя, если сильно проц не будет грузить индюк, который мониторит/пересчитывает в реал-тайм, то можно и так.

А то я замечал, что некоторые индюки "живые", которые что-нибудь считают налету, прям хорошо заставляют MT4 "кушать" проц... 😒

 

23 минуты назад, Ugar68 сказал:

 

Вот как то так. Отображает в виде комментария.

 

TP_Profit_Sum.mq4

 

Спасибо, пошёл тестить. 🙂

Share this post


Link to post
Share on other sites
ZeleBoba

Ugar68 опередил )))

мой вариант скрипта в виде коммента

 

s-defAllProfit.mq4

s-defAllProfit.ex4

  • Upvote 1

Лучше маленький профит, чем большие рога.

Share this post


Link to post
Share on other sites
Ugar68

Мой вариант отложенные ордера и ордера без тейков игнорит. Считает в реальном времени как индикатор в расчётах ничего сложного нет, так что вряд ли нагрузка будет.

Забыл написать, при вычислении учитываются свопы и комиссии если они есть.

  • Upvote 1

Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
rsansk

С Новым годом!

Пожалуйста, кто может написать советник по ТЗ:

1. MladenDZ_TMA_Bars_MTF- смена цвета на 3-ей свече вход. Выход при смене цвета и он же вход, так же 3-ей свече противоположного цвета.

2. Возможность изменять настройки индикатора в советнике

3. Работа советника по времени терминала или местному

4. Тралл ордера

5. Выход по трейку и стопу

6. Лот фиксированный

7. Фильтр вкл/откл: Параболик. Точка вверху, 3 свеча красная-закрытие bay, открытие sell и наоборот.

8. Фильтр вкл/откл: SSRC. Зеленые бары 3 свеча+стрелка вверх-закрытие sell, открытие bay. Красные бары 3 свеча+стрелка вниз-закрытие bay, открытие sell.

При включенных 2-х фильтрах, чтобы выполнялись все условия, по трем индикаторам.

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

Индикаторы Яндекс.Диск

Share this post


Link to post
Share on other sites
Radmond

Здравствуйте! Ищу помощи у профи! Нужен советник, который может выставлять отложенные ордера по максимальной цене ОТКРЫТИЯ и минимальной цене ЗАКРЫТИЯ (не путать с максимально достигнутыми ценами) за предыдущий день. Выставление ордеров происходит в 00:10 хотя бы (начало нового торгового дня). При срабатывании одного ордера, другой закрывается. В конце дня в 23:50 допустим все открытые ордера закрываются (неважно в + или нет), все отложенные удаляются, если не сработали. При наступлении новой нового дня (полночь), советник заново выставляет отлож.ордера по предыдущим ценам МАКСИМАЛЬНОГО открытия и МИНИМАЛЬНОГО закрытия в течении дня. png&tknv=v2&size=1903x968

У меня есть советник, который закрывает ордера в полночь и вытирает отложенные. не могу собрать на открытие ордеров по ценам открытия и закрытия.
 

Скрытый текст

//---- input parameters
extern int   CloseHour     = 23;      // Время закрытия, часы
extern int   CloseMinute   =50;      // Время закрытия, минуты
extern bool  UseCurrSymbol = False;  // Использовать только один инструмент
extern bool  UseOneAccount = False;  // Использовать только один счёт
extern int   NumberAccount = 0;  // Номер торгового счёта
extern int   Slippage      = 3;      // Проскальзывание цены
extern color clCloseBuy    = Blue;   // Цвет закрытия покупки
extern color clCloseSell   = Red;    // Цвет закрытия продажи

extern string _P_Expert = "---------- Параметры советника";

extern bool   UseSound        = False;           // Использовать звуковой сигнал
extern string NameFileSound   = "expert.wav";    // Наименование звукового файла

extern int    NumberOfTry     = 5;               // Количество попыток
extern int    PauseAfterError = 75;              // Пауза после ошибки в секундах


//------- Глобальные переменные советника --------------------------------------
color clDelete = Yellow;               // Цвет значка удаления ордера

//------- Подключение внешних модулей ------------------------------------------
#include <stdlib.mqh>

//+----------------------------------------------------------------------------+
//|  expert initialization function                                            |
//+----------------------------------------------------------------------------+
void init() { if (!IsTesting()) Comment(""); }

//+----------------------------------------------------------------------------+
//|  expert deinitialization function                                          |
//+----------------------------------------------------------------------------+
void deinit() { if (!IsTesting()) Comment(""); }

//+----------------------------------------------------------------------------+
//|  expert start function                                                     |
//+----------------------------------------------------------------------------+
void start() {
  if (NumberAccount>0 && NumberAccount!=AccountNumber()) {
    Comment("Торговля на счёте: "+AccountNumber()+" ЗАПРЕЩЕНА!");
    return;
  }

  if (ExistPositions()) DeleteOrders();
  
  double pBid, pAsk;

  if (UseOneAccount && AccountNumber()!=NumberAccount) {
    Comment("Работа на счёте: "+AccountNumber()+" ЗАПРЕЩЕНА!");
    return;
  } else Comment("");

  if (Hour()==CloseHour && Minute()>=CloseMinute) {
    for (int i=OrdersTotal()-1; i>=0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
        if (!UseCurrSymbol || OrderSymbol()==Symbol()) {
          if (OrderType()==OP_BUY) {
            pBid=MarketInfo(OrderSymbol(), MODE_BID);
            OrderClose(OrderTicket(), OrderLots(), pBid, Slippage, clCloseBuy);
          }
          if (OrderType()==OP_SELL) {
            pAsk=MarketInfo(OrderSymbol(), MODE_ASK);
            OrderClose(OrderTicket(), OrderLots(), pAsk, Slippage, clCloseSell);
          }
        }
      }
    }
  }
  
  
}


//+----------------------------------------------------------------------------+
//|  Удаление ордеров                                                          |
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" - текущий символ)                   |
//|    op - операция                   (-1 - любой ордер)                      |
//|    mn - MagicNumber                (-1 - любой магик)                      |
//+----------------------------------------------------------------------------+
void DeleteOrders(string sy="", int op=-1, int mn=-1) {
  bool fd;
  int  err, i, it, k=OrdersTotal(), ot;

  if (sy=="") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot==OP_BUYLIMIT || ot==OP_BUYSTOP || ot==OP_SELLLIMIT || ot==OP_SELLSTOP) {
        if (OrderSymbol()==sy && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            for (it=1; it<=NumberOfTry; it++) {
              if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
              while (!IsTradeAllowed()) Sleep(5000);
              fd=OrderDelete(OrderTicket(), clDelete);
              if (fd) {
                if (UseSound) PlaySound(NameFileSound); break;
              } else {
                err=GetLastError();
                Print("Error(",err,") delete order ",GetNameOP(ot),": ",ErrorDescription(err),", try ",it);
                Sleep(1000*PauseAfterError);
              }
            }
          }
        }
      }
    }
  }
}

//+----------------------------------------------------------------------------+
//|  Возвращает флаг существования позиций                                     |
//|  Параметры:                                                                |
//|    sym - наименование инструмента ("" - текущий символ)                    |
//|    op  - операция                 (-1 - любая позиция)                     |
//|    mn  - MagicNumber              (-1 - любой магик)                       |
//+----------------------------------------------------------------------------+
bool ExistPositions(string sym="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();

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

//+----------------------------------------------------------------------------+
//|  Возвращает наименование торговой операции                                 |
//|  Параметры:                                                                |
//|    op - идентификатор торговой операции                                    |
//+----------------------------------------------------------------------------+
string GetNameOP(int op) {
    switch (op) {
        case OP_BUY      : return("Buy");
        case OP_SELL     : return("Sell");
        case OP_BUYLIMIT : return("Buy Limit");
        case OP_SELLLIMIT: return("Sell Limit");
        case OP_BUYSTOP  : return("Buy Stop");
        case OP_SELLSTOP : return("Sell Stop");
        default          : return("Unknown Operation");
    }
}
//+----------------------------------------------------------------------------+

 


Не могу внедрить сюда код открытия сделок((((( Помогите пожалуйста!

Edited by AntFX
13

Share this post


Link to post
Share on other sites
AntFX
15 часов назад, Radmond сказал:

выставлять отложенные ордера по максимальной цене ОТКРЫТИЯ и минимальной цене ЗАКРЫТИЯ (не путать с максимально достигнутыми ценами) за предыдущий день

Вы противоречите сами себе. У ценовых рядов есть 4 параметра на каждом баре: цена открытия, цена закрытия, максимальная цена и минимальная цена. Таких параметров, как максимальная цена открытия и минимальная цена закрытия у ценовых рядов нет.


1

Share this post


Link to post
Share on other sites
Radmond
19 часов назад, AntFX сказал:

Вы противоречите сами себе. У ценовых рядов есть 4 параметра на каждом баре: цена открытия, цена закрытия, максимальная цена и минимальная цена. Таких параметров, как максимальная цена открытия и минимальная цена закрытия у ценовых рядов нет.

Поленились вложенный скрин открыть?) Ок. Опишу сюда: У нас есть период ДЕНЬ на графике H1, который состоит из 24 свечей. Необходимо за период в 24 свечи найти самую высокую цену ОТКРЫТИЯ какой-либо свечи в этот день и минимальную цену ЗАКРЫТИЯ какой-либо свечи за этот день. Не путайте ряд из 24 свечек за день с одной дневной свечкой. Я говорю про РЯД свечей. Тени свечей меня не интересуют. нужный конкретные цифры ОТКРЫТИЯ и ЗАКРЫТИЯ в диапазоне из 24 свечек.

 

Я допилил сову. Теперь она открывает отложенные ордера, закрывает один, если другой сработал. В конце дня закрывает все позиции, и в полночь открывает новые отложенные позиции. НО! Ордера откладываются по максимуму и минимуму дня. Это значит что в диапазон входят тени дневной свечи, а мне так не нужно!. 

 

Скрытый текст

extern string TimeSet      = "00:00";  //Order place time, if TimeSet = "00:00", the EA works on the breakdown of the previous day. 
extern int    Delta        = 6,        //Order price shift (in points) from High/Low price
              SL           = 0,      //Stop Loss (in points)
              TP           = 0,       //Take Profit (in points)
              risk         = 0,        //if 0, fixed lot is used
              NoLoss       = 0,        //if 0, it doesn't uses break-even
              trailing     = 0;        //if 0, it doesn't uses trailing
extern double Lot          = 0.10;     //used only if risk = 0
extern bool   OpenStop     = true;     //Place stop orders if order is opened
extern color  color_BAR    = DarkBlue; //info color

extern int   CloseHour     = 23;      // Время закрытия, часы
extern int   CloseMinute   = 50;      // Время закрытия, минуты
extern bool  UseCurrSymbol = False;  // Использовать только один инструмент
extern bool  UseOneAccount = False;  // Использовать только один счёт
extern int   NumberAccount = 0;  // Номер торгового счёта
extern int   Slippage      = 3;      // Проскальзывание цены
extern color clCloseBuy    = Blue;   // Цвет закрытия покупки
extern color clCloseSell   = Red;    // Цвет закрытия продажи

extern string _P_Expert = "---------- Параметры советника";

extern bool   UseSound        = False;           // Использовать звуковой сигнал
extern string NameFileSound   = "expert.wav";    // Наименование звукового файла

extern int    NumberOfTry     = 5;               // Количество попыток
extern int    PauseAfterError = 75;              // Пауза после ошибки в секундах

//------- Глобальные переменные советника --------------------------------------
color clDelete = Yellow;               // Цвет значка удаления ордера

//------- Подключение внешних модулей ------------------------------------------
#include <stdlib.mqh>

//--------------------------------------------------------------------
double        MaxPrice,MinPrice;
int           STOPLEVEL,magic=123321,tip,TimeBarbuy,TimeBarSell,LastDay;
//--------------------------------------------------------------------
int init()
{
   STOPLEVEL = MarketInfo(Symbol(),MODE_STOPLEVEL);
   if (SL < STOPLEVEL) SL = STOPLEVEL;
   if (TP < STOPLEVEL) TP = STOPLEVEL;
   if (NoLoss   < STOPLEVEL && NoLoss   != 0) NoLoss   = STOPLEVEL;
   if (trailing < STOPLEVEL && trailing != 0) trailing = STOPLEVEL;
   Comment("Copyright © 2011 cmillion@narod.ru\n BreakdownLevelDay input parameters"+"\n"+
      "TimeSet   "   , TimeSet,           "\n",
      "Delta       " , Delta,             "\n",
      "SL           ", SL,                "\n",
      "TP          " , TP,                "\n",
      "Lot          ", DoubleToStr(Lot,2),"\n",
      "risk         ", risk,              "\n",
      "NoLoss    "   , NoLoss,            "\n",
      "trailing     ", trailing);
   if (TimeSet=="00:00") LastDay=1;
}
//--------------------------------------------------------------------
int start()
{     
   if (OpenStop) magic=TimeDay(CurTime());
   if (!IsDemo()) {Comment("Demo version, contact cmillion@narod.ru");return;};
   //-----------------------------------------------------------------
   
   
   if (ExistPositions()) DeleteOrders();
  
  double pBid, pAsk;

  
  if (Hour()==CloseHour && Minute()>=CloseMinute) {
    for (int i=OrdersTotal()-1; i>=0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
        if (!UseCurrSymbol || OrderSymbol()==Symbol()) {
          if (OrderType()==OP_BUY) {
            pBid=MarketInfo(OrderSymbol(), MODE_BID);
            OrderClose(OrderTicket(), OrderLots(), pBid, Slippage, clCloseBuy);
          }
          if (OrderType()==OP_SELL) {
            pAsk=MarketInfo(OrderSymbol(), MODE_ASK);
            OrderClose(OrderTicket(), OrderLots(), pAsk, Slippage, clCloseSell);
          }
        }
      }
    }
  };
   
   
      
     
     
   int buy,sel,error;
   bool BUY=false,SEL=false;
   for ( i=0; i<OrdersTotal(); i++)
   {  if (OrderSelect(i, SELECT_BY_POS)==true)
      {  
         if (OrderSymbol()!=Symbol() || OrderMagicNumber()!=magic) continue;
         tip=OrderType();
         if (tip==0) BUY = true;
         if (tip==1) SEL = true;
         if (tip==4) buy++;
         if (tip==5) sel++;
      }   
   }
   if ((BUY||SEL)&&(buy!=0||sel!=0)) DelAllStop();          // delete stop orders if order opened
   if ( BUY||SEL) 
   {
      if (trailing!=0) TrailingStop(trailing);
      if (NoLoss!=0) No_Loss(NoLoss);
      return;                                              // opened order exist
   }
   if (TimeStr(CurTime())!=TimeSet) return;                // if time isn't equal to order set time
   
   int expiration=CurTime()+(23-TimeHour(CurTime()))*3600+(60-TimeMinute(CurTime()))*60;  //set order expiration time
   double TrPr,StLo;
   if (risk!=0) Lot = LOT(); 
   if (buy<1&&TimeBarbuy!=TimeDay(CurTime()))
   {
      MaxPrice=iHigh(NULL,1440,LastDay)+NormalizeDouble(Delta*Point,Digits);
      if (Ask+STOPLEVEL*Point>MaxPrice) MaxPrice = NormalizeDouble(Ask+STOPLEVEL*Point,Digits);
      if (TP!=0) TrPr = NormalizeDouble(MaxPrice + TP * Point,Digits);                 
      if (SL!=0) StLo = NormalizeDouble(MaxPrice - SL * Point,Digits);                 
      error=OrderSend(Symbol(),OP_SELLLIMIT ,Lot,MaxPrice,3,StLo,TrPr,"BUYSTOP BLD",magic,expiration,Blue);
      if (error==-1) Alert("Error BUYSTOP ",GetLastError(),"   ",Symbol(),"   Lot ",Lot,"   Price ",MaxPrice,"   SL ",StLo,"   TP ",TrPr,"   expiration ",expiration);
      else TimeBarbuy=TimeDay(CurTime());
   }
   if (sel<1&&TimeBarSell!=TimeDay(CurTime()))
   {
      MinPrice=iLow(NULL,1440,LastDay)-NormalizeDouble(Delta*Point,Digits);
      if (Bid-STOPLEVEL*Point<MinPrice) MinPrice = NormalizeDouble(Bid-STOPLEVEL*Point,Digits);
      if (TP!=0) TrPr = NormalizeDouble(MinPrice - TP * Point,Digits);                 
      if (SL!=0) StLo = NormalizeDouble(MinPrice + SL * Point,Digits);   
      error=OrderSend(Symbol(),OP_BUYLIMIT,Lot,MinPrice,3,StLo,TrPr,"SELLSTOP BLD",magic,expiration,Red );
      if (error==-1) Alert("Error SELLSTOP ",GetLastError(),"   ",Symbol(),"   Lot ",Lot,"   Price ",MinPrice,"   SL ",StLo,"   TP ",TrPr,"   expiration ",expiration);
      else TimeBarSell=TimeDay(CurTime());
   }
   if (buy<1&&sel<1)
   {
      ObjectDelete("bar0");
      ObjectCreate("bar0", OBJ_RECTANGLE, 0, 0,0, 0,0);
      ObjectSet   ("bar0", OBJPROP_STYLE, STYLE_SOLID);
      ObjectSet   ("bar0", OBJPROP_COLOR, color_BAR);
      ObjectSet   ("bar0", OBJPROP_BACK,  true);
      ObjectSet   ("bar0", OBJPROP_TIME1 ,iTime( NULL, 1440, 0));
      ObjectSet   ("bar0", OBJPROP_PRICE1,MaxPrice);
      ObjectSet   ("bar0", OBJPROP_TIME2 ,CurTime());
      ObjectSet   ("bar0", OBJPROP_PRICE2,MinPrice);
   }
   return(0);

 }
//--------------------------------------------------------------------
void DelAllStop()
{
   int tip;
   for (int i=0; i<OrdersTotal(); i++)
   {                                               
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
      {
         if (OrderSymbol()!=Symbol()||OrderMagicNumber()!=magic) continue;
         tip=OrderType();
         if (tip==4||tip==5) OrderDelete(OrderTicket());
      }   
   }
}
//--------------------------------------------------------------------
void TrailingStop(int trailing)
{
   double TrPr,StLo;
   int tip;
   bool error;
   color col;
   for (int i=0; i<OrdersTotal(); i++) 
   {
      if (OrderSelect(i, SELECT_BY_POS)==true)
      {
         tip = OrderType();
         if (tip<2 && OrderSymbol()==Symbol())
         {
            if (OrderMagicNumber()!=magic) continue;
            if (tip==0) //Buy               
            {  
               StLo = Bid - trailing*Point;          
               if (StLo > OrderStopLoss() && StLo > OrderOpenPrice()) 
                  {error=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(StLo,Digits),OrderTakeProfit(),0,White);Comment("Trailing "+OrderTicket());Sleep(500);}
            }                                         
            if (tip==1) //Sell               
            {                                         
               StLo = Ask + trailing*Point;            
               if (StLo < OrderStopLoss() && StLo < OrderOpenPrice()) 
                  {error=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(StLo,Digits),OrderTakeProfit(),0,White);Comment("Trailing "+OrderTicket());Sleep(500);}
            } 
            if (error==false && SL!=0) Alert("Error SELLSTOP ",GetLastError(),"   ",Symbol(),"   SL ",StLo);
         }//tip<2
      }//OrderSelect
   }//for
}
//------------------------------------------------------------------+
double LOT()
{
   double MINLOT = MarketInfo(Symbol(),MODE_MINLOT);
   double LOT = AccountFreeMargin()*risk/100/MarketInfo(Symbol(),MODE_MARGINREQUIRED)/15;
   if (LOT>MarketInfo(Symbol(),MODE_MAXLOT)) LOT = MarketInfo(Symbol(),MODE_MAXLOT);
   if (LOT<MINLOT) LOT = MINLOT;
   if (MINLOT<0.1) LOT = NormalizeDouble(LOT,2); else LOT = NormalizeDouble(LOT,1);
   return(LOT);
}
//------------------------------------------------------------------+
void No_Loss(int NoLoss)
{
   double TrPr,StLo;
   int tip;
   bool error;
   color col;
   for (int i=0; i<OrdersTotal(); i++) 
   {
      if (OrderSelect(i, SELECT_BY_POS)==true)
      {
         tip = OrderType();
         if (tip<2 && OrderSymbol()==Symbol())
         {
            if (OrderMagicNumber()!=magic) continue;
            if (tip==0) //Buy
            {  
               if (OrderStopLoss()>=OrderOpenPrice()) return;
               StLo = Bid - NoLoss*Point;          
               if (StLo > OrderStopLoss() && StLo > OrderOpenPrice()) 
                  {error=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(StLo,Digits),OrderTakeProfit(),0,White);Comment("Trailing "+OrderTicket());Sleep(500);}
            }                                         
            if (tip==1) //Sell               
            {                                         
               if (OrderStopLoss()<=OrderOpenPrice()) return;
               StLo = Ask + NoLoss*Point;            
               if (StLo < OrderStopLoss() && StLo < OrderOpenPrice()) 
                  {error=OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(StLo,Digits),OrderTakeProfit(),0,White);Comment("Trailing "+OrderTicket());Sleep(500);}
            } 
            if (error==false && SL!=0) Alert("Error SELLSTOP ",GetLastError(),"   ",Symbol(),"   SL ",StLo);
         }//tip<2
      }//OrderSelect
   }//for
}
//------------------------------------------------------------------+
string TimeStr(int taim)
{
   string sTaim;
   int HH=TimeHour(taim);     // Hour                  
   int MM=TimeMinute(taim);   // Minute   
   if (HH<10) sTaim = StringConcatenate(sTaim,"0",DoubleToStr(HH,0));
   else       sTaim = StringConcatenate(sTaim,DoubleToStr(HH,0));
   if (MM<10) sTaim = StringConcatenate(sTaim,":0",DoubleToStr(MM,0));
   else       sTaim = StringConcatenate(sTaim,":",DoubleToStr(MM,0));
   return(sTaim);
}
//-------------------------------------------------------------------+

void CloseOrder()
{double PR=0;
 while(!IsTradeAllowed()) Sleep(100);
 if(OrderType()==OP_BUY)  PR=Bid;
 if(OrderType()==OP_SELL) PR=Ask;
 if(!OrderClose(OrderTicket(),OrderLots(),PR,3,CLR_NONE));
return;}

//-------------------------------------------------------------------

void DeleteOrders(string sy="", int op=-1, int mn=-1) {
  bool fd;
  int  err, i, it, k=OrdersTotal(), ot;

  if (sy=="") sy=Symbol();
  for (i=k-1; i>=0; i--) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      ot=OrderType();
      if (ot==OP_BUYLIMIT || ot==OP_BUYSTOP || ot==OP_SELLLIMIT || ot==OP_SELLSTOP) {
        if (OrderSymbol()==sy && (op<0 || ot==op)) {
          if (mn<0 || OrderMagicNumber()==mn) {
            for (it=1; it<=NumberOfTry; it++) {
              if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
              while (!IsTradeAllowed()) Sleep(5000);
              fd=OrderDelete(OrderTicket(), clDelete);
              if (fd) {
                if (UseSound) PlaySound(NameFileSound); break;
              } else {
                err=GetLastError();
                
                Sleep(1000*PauseAfterError);
              }
            }
          }
        }
      }
    }
  }
}

//-------------------------------------------------------------------


bool ExistPositions(string sym="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal();

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

//-------------------------------------------------------------------

string GetNameOP(int op) {
    switch (op) {
        case OP_BUY      : return("Buy");
        case OP_SELL     : return("Sell");
        case OP_BUYLIMIT : return("Buy Limit");
        case OP_SELLLIMIT: return("Sell Limit");
        case OP_BUYSTOP  : return("Buy Stop");
        case OP_SELLSTOP : return("Sell Stop");
        default          : return("Unknown Operation");
    }
}

 p.s. сова копипастовая.

Edited by AntFX
п. 13

Share this post


Link to post
Share on other sites
AntFX
13 часов назад, Radmond сказал:

Поленились вложенный скрин открыть?)

1. Это Вы, уважаемый, поленились этот скрин расшарить - для всех кроме Вас ссылка показывает страницу 403

2. Так бы сразу и сказали - имеется в виду ряд из 24 часовых свечи внутри дня, тогда вопросов бы не возникло.

2. Пожалуйста, большие блоки кода убирайте под спойлер, либо прикладывайте в виде файлов. Подобная манера выкладывания кода мешает всем (кроме Вас, разумеется) этот форум читать.

 

Edited by AntFX

1

Share this post


Link to post
Share on other sites
Hitronrav
21 час назад, Radmond сказал:

Я говорю про РЯД свечей. Тени свечей меня не интересуют. нужный конкретные цифры ОТКРЫТИЯ и ЗАКРЫТИЯ в диапазоне из 24 свечек. 

 

Да без проблем. Замените

MaxPrice=iHigh(NULL,1440,LastDay)+NormalizeDouble(Delta*Point,Digits);

на

MaxPrice=iOpen(Symbol(),PERIOD_H1,iHighest(Symbol(),PERIOD_H1,MODE_OPEN,24,MathMax(iBarShift(Symbol(),PERIOD_H1,iTime(Symbol(),PERIOD_D1,LastDay))-23,0)))
       +NormalizeDouble(Delta*Point,Digits);

и

MinPrice=iLow(NULL,1440,LastDay)-NormalizeDouble(Delta*Point,Digits);

на

MinPrice=iClose(Symbol(),PERIOD_H1,iLowest(Symbol(),PERIOD_H1,MODE_CLOSE,24,MathMax(iBarShift(Symbol(),PERIOD_H1,iTime(Symbol(),PERIOD_D1,LastDay))-23,0)))
       -NormalizeDouble(Delta*Point,Digits);

PS. картинки лучше выкладывать не через яндекс.диск, а скриншотером, например этим http://skrinshoter.ru/

Edited by Hitronrav
  • Thanks 1

Спешите застолбить лояльную оферту на моём памме, она открыта только по 15 января.

Share this post


Link to post
Share on other sites
AntZ

Здравствуйте. Существует ли реально работающий компилятор кода   mql4  в  mql5 ?

Share this post


Link to post
Share on other sites
Ugar68
55 минут назад, AntZ сказал:

Здравствуйте. Существует ли реально работающий компилятор кода   mql4  в  mql5 ?

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


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
AntFX
2 часа назад, AntZ сказал:

Здравствуйте. Существует ли реально работающий компилятор кода   mql4  в  mql5 ?

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

Однако MQ постарались сделать так (не намеренно такой выдающийся результат получить сложно), чтобы перенос кода между платформами был максимально затруднен

Edited by AntFX

1

Share this post


Link to post
Share on other sites
AntZ

То есть "реально работающий компилятор" это только живой человек ))) В четвёрке как я понимаю скорость тестирования из-за работы одного ядра не увеличить, а может есть ещё тестеры которые с кодом mql4 работают и чтоб мультивалютный тест делать? Я что-то ничего не нашёл.  Или всё-таки легче на пятёрку переходить?

Share this post


Link to post
Share on other sites
AntFX
Только что, AntZ сказал:

То есть "реально работающий компилятор" это только живой человек ))) В четвёрке как я понимаю скорость тестирования из-за работы одного ядра не увеличить, а может есть ещё тестеры которые с кодом mql4 работают и чтоб мультивалютный тест делать? Я что-то ничего не нашёл.  Или всё-таки легче на пятёрку переходить?

МТ5 тоже тестирует на одном ядре, многоядерная там только оптимизация (у этого есть разные забавные следствия, Вы поймете если начнете с ним работать). Кроме пятерки никаких готовых инструментов для такого тестинга я не встречал.


1

Share this post


Link to post
Share on other sites
AntZ

на самом деле странно это, при таком развитии мощностей компьютеров нельзя их использовать...

Share this post


Link to post
Share on other sites
Ugar68

Не только тестер МТ4, но и множество других программ не умеют работать с кучей ядер. Но за то операционка нормально справляется с раскидыванием задач по ядрам. То что применено в тестере МТ5 это раскидывание проходов оптимизации по ядрам. Ядра в качестве агентов тестировани.  Можно запустить несколько терминалов МТ4, распределить проходы оптимизации на разные тестеры и запустить. Операционка раскидает терминалы по ядрам. Будет почти то же самое что что в тестере МТ5. Почти потому что:

1. Результаты придётся собирать с нескольких тестеров и анализировать самому.

2. В тестере МТ5 можно использовать сетевые компьютеры как агенты тестирования. Так же можно использовать сервис онлайн агентов.

А на счёт скорости работы тестера МТ5 по сравнению с МТ4. Я бы сказал что тест в МТ5 на всех тиках гораздо медленнее чем в МТ4. Оптимизация может оказаться быстрее на МТ5 только за счёт привлечения множества агентов.


Пишу советники и индикаторы по вашим алгоритмам. Пишите в личку.
Чужие программы не переделываю.

Share this post


Link to post
Share on other sites
AntFX

А ещё МТ5 очень плохо справляется с управлением загрузкой и выгрузкой разных таймсерий (символов) при мультивалютном тестинге. Большую часть времени занимает именно загрузка истории. Поэтому в особенности использовать облако при тестировании мультивалютных стратегий в нем не рекомендую.


1

Share this post


Link to post
Share on other sites
AntZ

Спасибо за предельно ясные объяснения. Теперь точно не нацелен на МТ5. Ещё пару вопросиков. В тестере четвёрке визуально на графике средства видно что просадка допустим 1000 а в отчёте 5000, как это можно объяснить? Можно ли получить числовые данные средств в каждую единицу времени(чтоб график построить), может  допустим на каждой минуте в файл записывать? Просто хочется чтоб ось Х была обозначена не номерами ордеров а чтоб график был равномерно времени отрисован. Потом можно будет в экселе суммировать и отрисовывать графики как мультивалютный тест, да и на одной паре по разным таймфреймам.

Share this post


Link to post
Share on other sites
AntFX
6 минут назад, AntZ сказал:

Спасибо за предельно ясные объяснения. Теперь точно не нацелен на МТ5.

И тем не менее он бывает очень удобным. В частности, при всей неудобности работы с мультивалютной историей, в МТ4 протестировать мультивалютную стратегию просто невозможно без танцев с бубном. Кроме этого, МТ5 можно научить делать тестируемый символ оптимизируемым параметром, то есть даже односимвольный советник оптимизировать одновременно на разных символах. 

9 минут назад, AntZ сказал:

В тестере четвёрке визуально на графике средства видно что просадка допустим 1000 а в отчёте 5000, как это можно объяснить?

А там вообще есть график средств, или только баланса?))) В отчете тоже разные просадки показываются. Для конкретизации нужны скрины из тестера.

10 минут назад, AntZ сказал:

Можно ли получить числовые данные средств в каждую единицу времени(чтоб график построить), может  допустим на каждой минуте в файл записывать? Просто хочется чтоб ось Х была обозначена не номерами ордеров а чтоб график был равномерно времени отрисован. Потом можно будет в экселе суммировать и отрисовывать графики как мультивалютный тест, да и на одной паре по разным таймфреймам.

МТ4 строит график по сделкам, заставить его строить график по времени не получится. Как Вы правильно сказали для этого нужно самому из эксперта записывать эквити в файл.


1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×