Ваши вопросы по языку MQL4

djasper

Интересующийся
Спасибо. А можно через функцию оформить?
Можешь пример скинуть?
Вот как мне сюда это записать?
Код:
//------------------------------------------------------------------
#property copyright "www.forex-tsd.com"
//------------------------------------------------------------------
extern double StopLoss         = 5;
extern double TakeProfit       = 5;
extern int     ma1per            =5;
extern int     ma2per            =20;
extern int rper = 10;
extern int rur = 50;
extern int    ManualMagic       = 28282828;
extern int    Slippage          = 5;
extern double Lots              = 0.1;

bool dummyResult;
string s_symbol;
int    MAGIC;
int digit; 
static int prevtime = 0;
double point = 1;

//
int init() 
{
  s_symbol = Symbol();
  digit = MarketInfo(s_symbol,MODE_DIGITS);
  if (digit==2 || digit==4) point = 1;
  if (digit==3 || digit==5) point = 10;
  if (digit==6)             point = 100;
  MAGIC = ManualMagic;
  return(0);
}
//
int deinit() { Comment(""); return(0); }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
{
 double rsi1        = iRSI(NULL,0,21,PRICE_CLOSE,1);
 
   if (!ExistPositions())
   {
      
     if (BAISIGtf1())
    
     {
       OpenBuy();
       return(0);
     }

     if( rsi1>100 )
     {
       OpenSell();
       return(0);
     }
      
   }
  
return (0);
}
      

//===================================================================================

bool ExistPositions() {
	for (int i=0; i<OrdersTotal(); i++) {
		if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
			if (OrderSymbol() == s_symbol && OrderMagicNumber() == MAGIC) {
				return(true);
			}
		} 
   }
return(false);
}

//

 bool BAISIGtf1()
    { 
  double ma1 = iMA (NULL,0,ma1per,0,MODE_EMA,PRICE_CLOSE,1);
  double ma2 = iMA (NULL,0,ma2per,0,MODE_EMA,PRICE_CLOSE,1);

  double rsi1 = iRSI(NULL,0,rper,PRICE_CLOSE,1);
  double rsi2 = iRSI(NULL,0,rper,PRICE_CLOSE,2);
  
  {
	 if( ( rsi2<rur && rsi1>rur )  ) return(true);
	 }
	
   
return(false);
}


void OpenBuy() 
{ 

   double lbStop = 0; if (StopLoss>0)   lbStop = NormalizeDouble(Ask-StopLoss  *Point*point,digit);
   double lbTake = 0; if (TakeProfit>0) lbTake = NormalizeDouble(Ask+TakeProfit*Point*point,digit);
   dummyResult = OrderSend(s_symbol,OP_BUY,0.01,NormalizeDouble(Ask,Digits),Slippage,lbStop,lbTake,1,MAGIC,0); 
}		       

void OpenSell() 
{ 
   double lsStop = 0; if (StopLoss>0)   lsStop = NormalizeDouble(Bid+StopLoss  *Point*point,digit);
   double lsTake = 0; if (TakeProfit>0) lsTake = NormalizeDouble(Bid-TakeProfit*Point*point,digit);
   dummyResult = OrderSend(s_symbol,OP_SELL,0.01,NormalizeDouble(Bid,Digits),Slippage,lsStop,lsTake,1,MAGIC,0); 
}
 
Последнее редактирование:

djasper

Интересующийся
Используй флаг. МА пересеклись флаг = true, открыл ордер по пересечению RSI флаг = false и так далее.
Попробовал так, но не выходит. Подскажите.
//------------------------------------------------------------------
#property copyright "www.forex"
//------------------------------------------------------------------
extern double StopLoss = 50;
extern double TakeProfit = 50;

extern int ManualMagic = 28282828;
extern int Slippage = 5;
extern double Lots = 0.1;

bool dummyResult;
string s_symbol;
int MAGIC;
int digit;
static int prevtime = 0;
double point = 1;

//
int init()
{
s_symbol = Symbol();
digit = MarketInfo(s_symbol,MODE_DIGITS);
if (digit==2 || digit==4) point = 1;
if (digit==3 || digit==5) point = 10;
if (digit==6) point = 100;
MAGIC = ManualMagic;
return(0);
}
//
int deinit() { Comment(""); return(0); }
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
double rsi1 = iRSI(NULL,0,50,PRICE_CLOSE,1);

if (!ExistPositions())
{

if (BAISIGtf1())

{
OpenBuy();
return(0);
}

if( rsi1>100 )
{
OpenSell();
return(0);
}

}

return (0);
}


//===================================================================================

bool ExistPositions() {
for (int i=0; i<OrdersTotal(); i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol() == s_symbol && OrderMagicNumber() == MAGIC) {
return(true);
}
}
}
return(false);
}

//

bool BAISIGtf1()
{

double rsi1 = iRSI(NULL,0,14,PRICE_CLOSE,1);
double rsi2 = iRSI(NULL,0,14,PRICE_CLOSE,2);

{
if( ( rsi2<50 && rsi1>50 && BAISIGma() ) ) return(true);
}
return(false);
}


bool BAISIGma()
{

double ma1A = iMA (NULL,0,10,0,0,1,1);
double ma12A = iMA (NULL,0,10,0,0,1,2);
double ma2A = iMA (NULL,0,50,0,0,1,1);
double ma22A = iMA (NULL,0,50,0,0,1,2);
{
if( ( ma12A<ma22A && ma1A>ma2A ) ) return(true);
}
return(false);
}

void OpenBuy()
{
bool BAISIGma= true;
double lbStop = 0; if (StopLoss>0) lbStop = NormalizeDouble(Ask-StopLoss *Point*point,digit);
double lbTake = 0; if (TakeProfit>0) lbTake = NormalizeDouble(Ask+TakeProfit*Point*point,digit);
dummyResult = OrderSend(s_symbol,OP_BUY,0.01,NormalizeDouble(Ask,Digits),Slippage,lbStop,lbTake,1,MAGIC,0);
if( dummyResult > 0 )
BAISIGma= false;

}
void OpenSell()
{
double lsStop = 0; if (StopLoss>0) lsStop = NormalizeDouble(Bid+StopLoss *Point*point,digit);
double lsTake = 0; if (TakeProfit>0) lsTake = NormalizeDouble(Bid-TakeProfit*Point*point,digit);
dummyResult = OrderSend(s_symbol,OP_SELL,0.01,NormalizeDouble(Bid,Digits),Slippage,lsStop,lsTake,1,MAGIC,0);
}
 

Antej630

Прохожий
Помогите разобраться с расширениями файлов!

Доброе время суток! Помогите, пожалуйста со следуещей проблемой: Скачал сова для МТ4, а в нем файлы с разными расширениями: .mq4 и .ex4. Файлы с расширением .mq4 в терминал могу установить, а вот второе расширение мне не поддается. Как можно установить индикаторы с данным расширением (.ex4) в терминал?
 

Ugar

Гуру форума
Доброе время суток! Помогите, пожалуйста со следуещей проблемой: Скачал сова для МТ4, а в нем файлы с разными расширениями: .mq4 и .ex4. Файлы с расширением .mq4 в терминал могу установить, а вот второе расширение мне не поддается. Как можно установить индикаторы с данным расширением (.ex4) в терминал?
mq4 это исходный текст программы, ex4 сама скомпилированная программа. В терминале работает именно ex4. а mq4 нужен для внесения изменений в программу.
Если в терминал установить только mq4 и не установить ex4, терминал при запуске сам пытается скомпилировать и создать ex4.
 

MrGreen86

Гуру форума
Доброе время суток! Помогите, пожалуйста со следуещей проблемой: Скачал сова для МТ4, а в нем файлы с разными расширениями: .mq4 и .ex4. Файлы с расширением .mq4 в терминал могу установить, а вот второе расширение мне не поддается. Как можно установить индикаторы с данным расширением (.ex4) в терминал?
в терминале нажми "файл" "открыть каталог данных". В открывшемся окне проводника открой папку "mql4\experts\", туда и положи ex4 файл.
если все ок - после перезапуска терминала советник появится в терминале.
 

Antej630

Прохожий
в терминале нажми "файл" "открыть каталог данных". В открывшемся окне проводника открой папку "mql4\experts\", туда и положи ex4 файл.
если все ок - после перезапуска терминала советник появится в терминале.

Спасибо! Кнопка Спасибо почему-то не высвечивается у меня. Разобрался с вашей помощью.
 

panand

Местный знаток
Добрый день!
В MQL существует такая вещь как фиксация профита стопового ордера?
Например, имеем несколько стоповых ордеров ,отделенные между собой, заданным количеством пунктов-шагом. От выбранного ордера задается фиксация прибыли через заданное количество пунктов,который ордер должен пройти ,либо заданный ценовой уровень другого ордера(колено) на котором должен зафиксироваться профит.
Понятие фиксации профита,это когда рыночная цена пройдя заданный ценовой уровень данного ордера фиксирует профит,где в дальнейшем прохождение рыночной цены далее или обратно в откат,не меняет саму уже фиксированную прибыль в увеличении профита или в уменьшении,далее в убыток.
Насколько я знаю,в коде существует пару функций- это либо закрытие по заданной цене , либо локирование путем встречного ордера.
Но меня не интересует закрытие или выставление встречного ордера для лока.
Скажите,кроме локирования или закрытия ордера при текущем цикле без фиксации по общему закрытию, существует ли алгоритм именно - фиксации профита ордера, без дальнейшего его изменения при любом движении рыночной цены и его сохранения до закрытия цикла и без помощи дополнительного ордера ?
Если существует,пожалуйста, назовите эту функцию или алгоритм, а если не существует,то опишите почему и возможно его создать.
Это вопрос задаю опытным,грамотным и изобретательным специалистам по программированию MQL.
Спасибо за внимание.
Ау,люди,точнее специалисты-программисты MQL,Вы мне так и не ответили....повторю:
Что может заменить закрытие в профит, локирование ордера или цепочку ордеров,как бы фиксируя профит ордера на заданном ценовом уровне в течения работы текущего цикла до его фиксации по общему закрытию по профиту/просадка ???
 

ддеенниисс

Активный участник
Есть простые функции вроде close,delete итд,с помощью их создаётся всё что угодно и не нужно выдумывать лишнего.
 

panand

Местный знаток
Есть простые функции вроде close,delete итд,с помощью их создаётся всё что угодно и не нужно выдумывать лишнего.
Ну да,разумеется :) ,только я не программист,чтобы создавать все что угодно,чем и огорчен. Только почему не нужно выдумывать лишнего,если возможно выдумать?
 

panand

Местный знаток
Тут лингвист нужен, чтобы вникнуть в суть вопроса
Что не так?
Имеем ряд активных ордеров,для каждого ордера задается шаг в пп или валюта,для "замораживания" профита .
В период данного цикла активный ордер ,пройдя заданный шаг в пп в профит, оказавшись на заданном ценовом уровне, имел бы возможность зафиксировать профит или "заморозить",где при дальнейшем движении цены в любую сторону, профит ордера не меняется в прибыль или в убыток до сих пор,пока не закончиться текущий цикл с помощью принудительного окончания руками или закрытия по общему профиту или стоплосс.
Что тут не понятного?
Просто ищу замену закрытия по профиту или локирования встречными ордерами. Если такой алгоритм существует,то назовите его правильным языком. Либо напишите код и предоставьте.
Надеюсь без сурдопереводчика :D
 

ivansss

Новичок форума
Подскажите пожалуйста, как засунуть болинджера в подвал , как на фото ниже. Рассчитать болинджера можно,я думаю ( поправьте, если не прав, через массив CCI, у меня болинджер на ССI накладывается). Вопрос как это засунуть в подвал в советнике? Или проще найти и привязать индикатор через iCustom?
 

Вложения

  • Безымянный.png
    Безымянный.png
    33,1 КБ · Просмотры: 25

AlexeyVik

Программист mql4 mql5
Подскажите пожалуйста, как засунуть болинджера в подвал , как на фото ниже. Рассчитать болинджера можно,я думаю ( поправьте, если не прав, через массив CCI, у меня болинджер на ССI накладывается). Вопрос как это засунуть в подвал в советнике? Или проще найти и привязать индикатор через iCustom?
iBandsOnArray тебе в помощь. -https://docs.mql4.com/ru/indicators/ibandsonarray
 

Rennela

Новичок форума
Что не так?
Имеем ряд активных ордеров,для каждого ордера задается шаг в пп или валюта,для "замораживания" профита .
В период данного цикла активный ордер ,пройдя заданный шаг в пп в профит, оказавшись на заданном ценовом уровне, имел бы возможность зафиксировать профит или "заморозить",где при дальнейшем движении цены в любую сторону, профит ордера не меняется в прибыль или в убыток до сих пор,пока не закончиться текущий цикл с помощью принудительного окончания руками или закрытия по общему профиту или стоплосс.
Что тут не понятного?
Просто ищу замену закрытия по профиту или локирования встречными ордерами. Если такой алгоритм существует,то назовите его правильным языком. Либо напишите код и предоставьте.
Надеюсь без сурдопереводчика :D
И не пишут,потому что реально не понятно о чем речь.Если я правильно понял,то нет такого, да и как?И чем в данном случае лок не нравится? Даже маржин. требования к общей позиции уменьшаются.
 

panand

Местный знаток
И не пишут,потому что реально не понятно о чем речь.Если я правильно понял,то нет такого, да и как?И чем в данном случае лок не нравится? Даже маржин. требования к общей позиции уменьшаются.
Нет так нет. Спасибо что ответили.
Значит функция CloseBy с виртуальным тейком.
Где такой код можно найти?
 

Ugar

Гуру форума
Значит функция CloseBy с виртуальным тейком.
Где такой код можно найти?
Сам то понял что написал?
OrderCloseBy
Закрытие одним открытым ордером другого ордера, открытого по тому же самому инструменту, но в противоположном направлении.
Нет у этой функции не реальных не виртуальных тейков. Да и по смыслу функции быть не может.
Она закрывает 2 встречных рыночных ордера при запуске. Был Buy=2лота и Sell=1лот.
После применения OrderCloseBy останется Buy=1лот.
 
Последнее редактирование:

Rennela

Новичок форума
Нет так нет. Спасибо что ответили.
Значит функция CloseBy с виртуальным тейком.
Где такой код можно найти?

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

_SERG_

Активный участник
Что не так?
Имеем ряд активных ордеров,для каждого ордера задается шаг в пп или валюта,для "замораживания" профита .
В период данного цикла активный ордер ,пройдя заданный шаг в пп в профит, оказавшись на заданном ценовом уровне, имел бы возможность зафиксировать профит или "заморозить",где при дальнейшем движении цены в любую сторону, профит ордера не меняется в прибыль или в убыток до сих пор,пока не закончиться текущий цикл с помощью принудительного окончания руками или закрытия по общему профиту или стоплосс.
Что тут не понятного?
Просто ищу замену закрытия по профиту или локирования встречными ордерами. Если такой алгоритм существует,то назовите его правильным языком. Либо напишите код и предоставьте.
Надеюсь без сурдопереводчика :D

Братуха, тебе в Тридевятое царство!:laugh::laugh::laugh:
А ну, двое из ларца, одинаковых с лица!
Написать и предоставить!
:laugh::laugh::laugh::laugh:
Тут коллега вкратце изобразил, для тех, кто не понимает, к чему надо стремиться, что бы поняли, без сурдоперевода:
Код:
[B][B]Техническое задание[/B][/B]
  
Для  заказа советника клиенту необходимо предоставить точное  техническое  задание, что гарантирует легкость сотрудничества и  качественное исполнение. Самая распространенная ошибка при заказе  советника - это неправильная подача информации. Для написания советника  программисту не нужна лишняя информация. Все, что от вас требуется, -  это кратко изложить порядок работы по вашей системе. Именно от понимания  вашей торговой системы программистом зависит правильность работы  советника. Постарайтесь донести информацию без избыточности.
   
  В общем виде техническое задание на советник состоит из 4частей:
  
[LIST]
[*]     открытие сделки: условия, при которых мы открываем сделку;
[*]     сопровождение позиции: что делать с позицией между открытием и закрытием;
[*]     закрытие позиции: условия, при которых мы закрываем позицию;
[*]     особые условия: все; что не вошло в первые три пункта.
[/LIST]
  
Также в техническом задании необходимо указать:
  
[LIST]
[*]     название советника (необязательно);
[*]     торговая платформа;
[*]     используемые индикаторы;
[*]     настройки (необязательно).
[/LIST]
  
Для примера можно ознакомится с этим техническим заданием.

*** Ток я тож, не понял, чего на странице "техническое задание" 
      на сайте изображение  касается строительства, а не финансов.
Да и ветка есть, где народ по ТЗ совы пишет.
 
Последнее редактирование:

seronn

Новичок форума
Добрый день всем) Подскажите, как сделать, чтобы за 1 свечу могла быть открыта только 1 сделка, и не больше? Делаю так:

bool IfOrdOpClSelfBar(int Magic = 0){
for(int i = OrdersTotal(); i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){
if(OrderOpenTime()>iTime(Symbol(),Period(),0)){return(true);}
}
}
}
for(int i = OrdersHistoryTotal(); i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){
if(OrderCloseTime()>iTime(Symbol(),Period(),0)&&
OrderOpenTime()>iTime(Symbol(),Period(),0)){return(true);}
}
}
}
return(false);
}

в функции открытия после проверки условий:
if(!IfOrdOpClSelfBar(MagicBuy))
{ OpenOrd(OP_BUY); }

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

_SERG_

Активный участник
Добрый день всем) Подскажите, как сделать, чтобы за 1 свечу могла быть открыта только 1 сделка, и не больше? Делаю так:

bool IfOrdOpClSelfBar(int Magic = 0){
for(int i = OrdersTotal(); i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){
if(OrderOpenTime()>iTime(Symbol(),Period(),0)){return(true);}
}
}
}
for(int i = OrdersHistoryTotal(); i>=0; i--){
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)){
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic){
if(OrderCloseTime()>iTime(Symbol(),Period(),0)&&
OrderOpenTime()>iTime(Symbol(),Period(),0)){return(true);}
}
}
}
return(false);
}

в функции открытия после проверки условий:
if(!IfOrdOpClSelfBar(MagicBuy))
{ OpenOrd(OP_BUY); }

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

Используй "флаг", который перед открытием позиции проверяй, при наступлении новой свечи флаг обновляй, ну или, что ты там дальше делать собрался, делай.
 
Верх