Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#6076
13 часов назад, ademen сказал:

Метаквоты делаю разную степень защиты декомпила для маркета и терминала?

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

#6077

Разъясню простую истину. Если код запускается локально то это лишь вопрос времени, когда его вскроют, если он конечно кому-то нужен.

Если ваш код, это советник на двух индикаторах - такое никто смотреть не будет в попытках завладеть ноу-хау.

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

#6078

 Здравствуйте! Мне нужен советник или рабочая функция открытия отложенных ордеров . Я учусь и хочу к этой функции попробовать прикрутить трал. Спасибо.  

Изменено 16 октября, 2020 пользователем molot_1

#6080

Всем  привет. Функция поиска фрактала в индикаторе пропускает некоторые фракталы, которые находит при использовании в советнике. Не могу понять почему...

Вот так она используется в индикаторе:

//+--------------------------------------------------------------------+
double FrUP()                                         // возвращает значение фрактала из BarsForFractal баров
{
   double UpFr=0,Fr=0; int indxUpFr;
   
   indxUpFr = iHighest (Symbol(),0,MODE_HIGH,BarsForFractal,i);
   if (indxUpFr==i+(BarsForFractal+1)/2) UpFr = iHigh (Symbol(),0,i+(BarsForFractal+1)/2); 
   else UpFr=0;
   
   if (UpFr!=0) Fr=UpFr;
   
   return (Fr);
}

Вот так в советнике:

double FrUP()                                      
{
   double UpFr=0,Fr=0; int indxUpFr;
   
   indxUpFr = iHighest (Symbol(),0,MODE_HIGH,BarsForFractal,1);
   if (indxUpFr==(BarsForFractal+1)/2) UpFr = iHigh (Symbol(),0,(BarsForFractal+1)/2); 
   else UpFr=0;
   
   if (UpFr!=0) Fr=UpFr;
   
   return (Fr);
}
//BarsForFractal отвечает за количество баров во фрактале

Можно ли что либо предположить навскидку?

Подобным образом ведёт себя другая индикаторная функция на основе среднего. Может тут какой-то общий момент есть?

Изменено 18 октября, 2020 пользователем Николайец

#6081

Всем привет, хотел написать скрипт на выставление тейкпрофита, но что-то не сработало, кто может глянуть, помогите, пока не пойму.

void OnStart()
  {
    int ticket, TakeProfit = 500;
    double TP, value = NormalizeDouble(WindowPriceOnDropped(),Digits);
    
   for(int i=OrdersTotal()-1;i>=0;i--)
   {
      if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
      if(OrderSymbol()!=Symbol()) continue;
      
      ticket = OrderTicket();
      if(OrderType()==OP_BUY)    
      if(value>Ask)
      {  
       TP=NormalizeDouble(Ask+TakeProfit*Point,Digits); 
       bool res=OrderModify(ticket,OrderOpenPrice(),0,TP,0);
      }
      
      if(OrderType()==OP_SELL)
      if(value<Bid)
      {
       TP=NormalizeDouble(Bid-TakeProfit*Point,Digits); 
       bool ressel=OrderModify(ticket,OrderOpenPrice(),0,TP,0);
      }
   }     
   
  }

 

#6082

Напиши Принты внутри цикла- может у тебя не выполняется условие

if(value<Bid)
#6083

Подскажите, как проверить откат между двум точками. На вход подпрограмма получает только 2 величины  а ответ 1(если есть откат) либо 0. Чуть позже выложу свой вариант кода. 

#6084

Добрый день уважаемые программисты! Подскажите, пожалуйста, есть ли возможность готовый индикатор для терминала MetaTrader4 внедрить в терминал TradingView?

#6085
В 31.10.2020 в 15:24, sergey.mihaylovich сказал:

Подскажите, пожалуйста, есть ли возможность готовый индикатор для терминала MetaTrader4 внедрить в терминал TradingView?

Нужно знать язык программирования Pine и иметь открытый код индикатора в формате mq4. Ну либо найти такого программиста, который знает эти оба языка. Создайте платное задание на сайте MQL5 во вкладке фриланс.

#6086

Добрый день. Подскажите как найти в сетке открытых ордеров ордер с большим убытком. Ордера открываются одновременно sell и buy и разными размера лота. MQL4

#6087
22 часа назад, makssub сказал:

Добрый день. Подскажите как найти в сетке открытых ордеров ордер с большим убытком. Ордера открываются одновременно sell и buy и разными размера лота. MQL4

int OrderMinProfit(int oType = -1)// -1 - проверяем все типы ордеров, иначе передаем тип ордера для поиска с мин. профитом
{
   double oMinProfit = 9999999.0;
   int    oTicketTmp = 0;
   
   for(int i = 0;i < OrdersTotal();i++)
   {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderSymbol()!=_Symbol || OrderMagicNumber() != iMagic) continue;
      if(oType >-1 && OrderType() !=oType) continue;
      
      if(OrderProfit()< oMinProfit)
      {
         oMinProfit = OrderProfit();
         oTicketTmp = OrderTicket();
      }
   }
   
   return(oTicketTmp);
}
  

была ошибка - два return. Поправил

Изменено 6 ноября, 2020 пользователем usver73

#6088
9 часов назад, usver73 сказал:

int OrderMinProfit(int oType = -1)// -1 - проверяем все типы ордеров, иначе передаем тип ордера для поиска с мин. профитом
{
   double oMinProfit = 9999999.0;
   int    oTicketTmp = 0;
   
   for(int i = 0;i < OrdersTotal();i++)
   {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
      if(OrderSymbol()!=_Symbol || OrderMagicNumber() != iMagic) continue;
      if(oType >-1 && OrderType() !=oType) continue;
      
      if(OrderProfit()< oMinProfit)
      {
         oMinProfit = OrderProfit();
         oTicketTmp = OrderTicket();
      }
   }
   
   return(oTicketTmp);
}
  

была ошибка - два return. Поправил

Ну только oTicketTmp нужно инициализировать отрицательным числом.

Ноль - это возможный номер тикета, согласно контракту https://docs.mql4.com/trading/ordersend 

#6089

@Rigal как вы делаете погрузку истории? В частности в этом советнике /laboratoriya-profitfx/24/sovetnik-multivaljutnik-korzhik/21628/

Буду благодарен за участок кода в качестве примера.

Столкнулся с проблемой когда терминал врет о запрашиваемых данных. 

#6090
1 час назад, ademen сказал:

@Rigal как вы делаете погрузку истории? В частности в этом советнике /laboratoriya-profitfx/24/sovetnik-multivaljutnik-korzhik/21628/

Буду благодарен за участок кода в качестве примера.

Столкнулся с проблемой когда терминал врет о запрашиваемых данных. 

В аттаче библиотечка - я выкусил из нее все зависимости на остальные мои библиотеки.

HistoryLoader.mqh21 скач.

Используется так:

#include <HistoryLoader.mqh>
HistoryLoader* loader;

int OnInit() {
  loader = new HistoryLoader(Symbol());
}

void OnDeinit(const int reason)  {
  if(CheckPointer(loader) == POINTER_DYNAMIC)
  	delete (loader);
}

void OnTick() {
  //whatever code you have here
  loader.CheckReload();
}

В библиотеке прописан интервал проверки - загрузка будет выполняться только раз в этот интервал.

Изменено 7 ноября, 2020 пользователем Rigal

#6091

Добрый день уважаемые знатоки! Подскажите, пожалуйста. Возможно ли уже готовую торговую систему под MT4 переделать под платформу TradingView?

#6092
6 минут назад, sergey.mihaylovich сказал:

Добрый день уважаемые знатоки! Подскажите, пожалуйста. Возможно ли уже готовую торговую систему под MT4 переделать под платформу TradingView?

Да.

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

Насколько я знаю, автоматических решений нет

#6093
2 минуты назад, sergey.mihaylovich сказал:

Добрый день уважаемые знатоки! Подскажите, пожалуйста. Возможно ли уже готовую торговую систему под MT4 переделать под платформу TradingView?

Ну конечно можно.

  • Нужен открытый исходный код системы (расширение файла *.mq4) или как минимум подробную логику работы системы.
  • Человек знающий языки программирования MQL (от MetaTrader) и Pine (от TradingView).
#6094

Добрый день. По мотивам урока "Использование структур для повышения эффективности разработки программ" воодушевился применением функции внутри структуры и создал вот такую простейшую конструкцию в МТ5.

#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
#include <Trade\PositionInfo.mqh>
#include <Trade\OrderInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\AccountInfo.mqh>
#include <Trade\DealInfo.mqh>
#include <Expert\Money\MoneyFixedMargin.mqh>

CPositionInfo      m_position;// object of CPositionInfo class
COrderInfo         m_order;   // object of COrderInfo class
CTrade             m_trade;   // object of CTrade class
CSymbolInfo        m_symbol;  // object of CSymbolInfo class
CAccountInfo       m_account; // object of CAccountInfo class
CDealInfo          m_deal;    // object of CDealInfo class
CMoneyFixedMargin *m_money;   // object of CMoneyFixedMargin class
//+------------------------------------------------------------------+
//| Structure Positions                                              |
//+------------------------------------------------------------------+
struct STRUCT_POSITION
  {
   ENUM_POSITION_TYPE type;       // тип позиции
   ulong              ticket;     // тикет позиции
   long               identifier; // идентификатор
   long               magic;      // магический номер
   double             volume;     // объем позиции
   double             open_price; // цена открытия
   datetime           open_time;  // время открытия
   double             profit;     // профит позиции
   double             comission;  // комиссия
   double             swap;       // своп
   string             comment;    // комментарий
   
   void               GetCurrentPositionProperty();
  };
  STRUCT_POSITION StrPositionArray[];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   STRUCT_POSITION.GetCurrentPositionProperty();
  }
//+------------------------------------------------------------------+
//---Заполнение массива свойств позиций                              +
//+------------------------------------------------------------------+
void STRUCT_POSITION::GetCurrentPositionProperty(void)
{   
   ZeroMemory(this);
   int pos_total = PositionsTotal();
   ArrayResize(StrPositionArray,pos_total,1000);
   for(int i=0; i<pos_total; i++)
      {
         if(m_position.SelectByIndex(i))
            {
               StrPositionArray[i].ticket     = m_position.Ticket();                  // тикет позиции
               StrPositionArray[i].identifier = m_position.Identifier();              // идентификатор
               StrPositionArray[i].magic      = m_position.Magic();                   // магический номер
               StrPositionArray[i].comment    = m_position.Comment();                 // комментарий
               StrPositionArray[i].type       =(ENUM_POSITION_TYPE)m_position.PositionType();// тип позиции
               StrPositionArray[i].volume     = m_position.Volume();                  // объем позиции
               StrPositionArray[i].open_price = m_position.PriceOpen();               // цена открытия
               StrPositionArray[i].open_time  = m_position.Time();                    // время открытия
               StrPositionArray[i].profit     = m_position.Profit();                  // профит позиции
               StrPositionArray[i].comission  = m_position.Commission();              // комиссия
               StrPositionArray[i].swap       = m_position.Swap();                    // своп
            }
      } 
} 
//+------------------------------------------------------------------+

Компилятор выдает ошибку " '.' - name expected "

Подскажите плиз, что я сделал неправильно и как с этим бороться ???

Изменено 22 ноября, 2020 пользователем Logic

#6095

В структуре

STRUCT_POSITION

присутствует метод 

GetCurrentPositionProperty(void)

который рассчитывает и присваивает значения элементам структуры. Определяем тело метода вне структуры. Для этого используем операцию разрешения контекста (::).

В OnTick() вызываем фунцию:

 

void OnTick()
  {
//---
   STRUCT_POSITION.GetCurrentPositionProperty();
  }

И получаем ошибку:

'.' - name expected    eSower_and_Gather_5.mq5    69    19
Где накосячено не понимаю, помогите плиз.

#6096

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

#6097
3 часа назад, Just Trader сказал:

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

 

Советники

https://trueforex.pp.ua/

#6098

где найти индикатор TMA_Fair

#6100

Есть ли способ работать с файлами не из "песочницы"?

Пробовал делать как описано здесь: https://www.mql5.com/ru/articles/1540 . Набросал скрипт:

 

#property copyright ""
#property link      ""
#property version   "1.00"
#property strict

#include <WinUser32.mqh>
#import "kernel32.dll"
   int _lopen  (string path, int of);
   int _lcreat (string path, int attrib);
   int _llseek (int handle, int offset, int origin);
   int _lread  (int handle, int& buffer[], int bytes);
   int _lwrite (int handle, string buffer, int bytes);
   int _lclose (int handle);
#import

#define OF_READ               0
#define OF_WRITE              1
#define OF_READWRITE          2
#define OF_SHARE_COMPAT       3
#define OF_SHARE_DENY_NONE    4
#define OF_SHARE_DENY_READ    5
#define OF_SHARE_DENY_WRITE   6
#define OF_SHARE_EXCLUSIVE    7

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
  string terminal_data_path = TerminalInfoString(TERMINAL_DATA_PATH); 
  string filename = terminal_data_path+"\\templates\\" + "1.tpl";   
//  string filename = "1.tpl";  
  
  int filehandle = _lopen(filename, OF_READ);
  if (filehandle > 0)
  {
    Print("Файл " + filename + " открыт");
    _lclose(filehandle);
  }
  else Print("Ошибка открытия файла " + filename + ". Handle = " + IntegerToString(filehandle));
}

 

 

Получаю ошибку открытия файла, filehandle = -1.

Терминал build 1310. Windows 10, 64 bit. 

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025