Перейти к содержанию
Форекс Форум трейдеров Академии «MasterForex-V»

Создание Советника


Рекомендуемые сообщения

Привет всем!

Вопрос по поводу MF_Pivot AXEL 0-3255.

Он показывает только сам Pivot (пунктиром). По коду расчёт Pivotа - общий для всех сессий, только выбирается HLC нужного промежутка времени. Добавил код для построения параллельных линий уровней R1, R2, R3 и S1, S2, S3. Получилась ерунда… На рисунке видно. Сейчас я в тупике. Может я пытаюсь сделать невозможное, раз авторы этого не сделали?

С уважением, ЛЮКС.

P.S. Это моё первое сообщение, прошу прощение, если что-то не корректно.

 

http://img225.imageshack.us/img225/191/200808141409ab3.gif

Не изобретайте велосипед. Примеров готовых пивотов можно найти в MQL4 Code Base - Каталог советников, индикаторов, скриптов и библиотек кода

есть и простые, как в этом файле.

Pivot.zip

Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 200
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

Привет всем!

Вопрос по поводу MF_Pivot AXEL 0-3255.

Он показывает только сам Pivot (пунктиром). По коду расчёт Pivotа - общий для всех сессий, только выбирается HLC нужного промежутка времени. Добавил код для построения параллельных линий уровней R1, R2, R3 и S1, S2, S3. Получилась ерунда… На рисунке видно. Сейчас я в тупике. Может я пытаюсь сделать невозможное, раз авторы этого не сделали?

С уважением, ЛЮКС.

P.S. Это моё первое сообщение, прошу прощение, если что-то не корректно.

 

http://img225.imageshack.us/img225/191/200808141409ab3.gif

Не изобретайте велосипед. Примеров готовых пивотов можно найти в MQL4 Code Base - Каталог советников, индикаторов, скриптов и библиотек кода

есть и простые, как в этом файле.

 

Спасибо за отклик. Готовых пивотов действительно много, только они не меняют свои показания в течение дня в

отличие от MF_Pivot AXEL 0-3255. А те старые велосипеды уже наизобретал - иногда пользуюсь.

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Добрый день. Нужен простой советник который бы открывал позицию при пересечении 2 МА и закрывал позицию при при обратном пересечении с одновременным открытием противоположной позиции. Без стоп лоссов, ТР и доливок. Пытался найти в просторах нета ничего подобного не нашел. Пытаюсь сделать самостоятельно но он не работает. Может кто нибудь глянет и подскажет чего не так. Код прилагается.

 

//+------------------------------------------------------------------+

//| Mar.mq4 |

//| Copyright © 2008, MetaQuotes Software Corp. |

//| http://www.metaquotes.net |

//+------------------------------------------------------------------+

 

extern double Lots = 0.1;

 

// Это переменные, которые будут

// отображаться во время

// соединения эксперта с графиком

 

//+------------------------------------------------------------------+

//| |

//+------------------------------------------------------------------+

int start()

{

double MA_Fast,MA_Low;

int total, ticket, cnt;

// Просто переменные для использования в программе

 

// присвоение переменным значений

 

MA_Fast=iMA( NULL, 0, 1, 0, MODE_SMA, PRICE_TYPICAL, 1); // быстрая МА

MA_Low=iMA( NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, 1); // медленная МА

 

 

if(Bars<100)

{

Print("bars less than 100");

return(0);

}

// Это условие проверяет, есть ли в истории графиков более 100 свечей и если нет,

// выдает ошибку. Требуется для того, чтобы обратить ваше внимание на проблему

// недостатка информации

 

 

 

total=OrdersTotal();

if(total<1)

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

// Поэтому, чтобы ограничить количество открываемых позиций, ставят данный

// ограничитель. Если он стоит, то советник не будет открывать более определенного

// количества позиций <х

{

// no opened orders identified

if(AccountFreeMargin()<(1000*Lots))

{

Print("We have no money. Free Margin = ", AccountFreeMargin());

return(0);

}

// Еще один вспомогательный кусок кода. Если средств на счете недостаточно, он

// выдаст ошибку. Данный кусок полностью бесполезен, если советник работает

// в реальном времени, но очень полезен при тестинге на истории.

 

{

OrderSelect(OrdersHistoryTotal( )-1, SELECT_BY_POS, MODE_HISTORY);

 

// открытие длинной позиции

if(MA_Fast>MA_Low && OrderProfit()>=0)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots*1,Open[0],3,0,"покупка",16384,0,Green);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());

return(0);

}

 

// открытие короткой позиции

if(MA_Fast<MA_Low && OrderProfit()>=0)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots*1,Open[0],3,0,"продажа",16384,0,Red);

if(ticket>0)

{

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());

}

else Print("Error opening BUY order : ",GetLastError());

return(0);

}

 

// Наконец, мы добрались до самого интересного. Вместо этих иксов, надо вставить

// условие, при котором происходит покупка.

 

// Этот блок нужен только для того, чтобы записать в журнале, все ли прошло гладко.

// Или, в противном случае, записать ошибку, из-за которой что-то не получилось.

 

// Теперь о выходе. Тут также ничего не изменилось, просто RRRRRRR - условие

// закрытия сделки по BUY, ZZZZZZZZ - по SELL

return(0);

}

total=OrdersTotal();

for(cnt=0;cnt<total;cnt++)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()<=OP_SELL &&

OrderSymbol()==Symbol())

{

if(OrderType()==OP_BUY)

{

if(MA_Fast<MA_Low)

 

{

OrderClose(OrderTicket(),OrderLots(),Open[0],5,Red);

return(0);

}

 

}

 

}

if(OrderType()==OP_SELL)

{

if(MA_Fast>MA_Low)

 

{

OrderClose(OrderTicket(),OrderLots(),Open[0],5,Red);

return(0);

}

 

}

}

}

 

 

 

return(0);

}

 

 

Он не открывает ни одной позиции.

 

Заранее спасибо

Ссылка на комментарий
Поделиться на другие сайты

Если меняю вот этот кусок

ticket=OrderSend(Symbol(),OP_BUY,Lots*1,Open[0],3,0,"покупка",16384,0,Green);

на вот этот

ticket=OrderSend(Symbol(),OP_BUY,Lots*1,"покупка",16384,0,Green);

То он открывает 1 позу по бай и не закрывает ее.

Ссылка на комментарий
Поделиться на другие сайты

Добрый день. Нужен простой советник который бы открывал позицию при пересечении 2 МА и закрывал позицию при при обратном пересечении с одновременным открытием противоположной позиции. Без стоп лоссов, ТР и доливок. Пытался найти в просторах нета ничего подобного не нашел. Пытаюсь сделать самостоятельно но он не работает. Может кто нибудь глянет и подскажет чего не так. Код прилагается.

ой :rolleyes:

 

во-первых, повнимательнее проверьте параметры функции OrderSend().

 

во-вторых, помните, что покупки совершаются по цене Ask, а продажи по цене Bid.

 

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

Ссылка на комментарий
Поделиться на другие сайты

во-первых, повнимательнее проверьте параметры функции OrderSend().

 

во-вторых, помните, что покупки совершаются по цене Ask, а продажи по цене Bid.

 

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

Воспользовался Вашими советами и ... Помогло. Спасибо большое. А может еще подскажите как правильно написать открыться лотом равным ПОСЛЕДНЕМУ лоту. Это уже для другого советника Или где поискать можно. В хелпе не могу найти

Ссылка на комментарий
Поделиться на другие сайты

[Воспользовался Вашими советами и ... Помогло. Спасибо большое. А может еще подскажите как правильно написать открыться лотом равным ПОСЛЕДНЕМУ лоту. Это уже для другого советника Или где поискать можно. В хелпе не могу найти

не. ве. рю. :biggrin:

 

изучайте инструмент :wink: история ордеров вам доступна. если проанализировать её, то можно найти с каким лотом открывался последний ордер. отсюда и пляшите!

Ссылка на комментарий
Поделиться на другие сайты

изучайте инструмент :wink: история ордеров вам доступна. если проанализировать её, то можно найти с каким лотом открывался последний ордер. отсюда и пляшите!

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

Ссылка на комментарий
Поделиться на другие сайты

изучайте инструмент :wink: история ордеров вам доступна. если проанализировать её, то можно найти с каким лотом открывался последний ордер. отсюда и пляшите!

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

почему же не понял? "чтобы последняя сделка ... открывалась лотом равным предыдущему". вот. отыскиваем предыдущую сделку - и смотрим какой у неё лот.. первоначальный обычно в параметрах советника. ну и всё - смотрим условия всяческие ваши конкретные и делаем выбор..

Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

Здравсивуйте, в данный момент учу mql, сначала написал простенький советник на основе WPR, теперь пытаюсь прилепит к нему лок - не порлучается, вроде бы все делаю правильно, но советник не хочет работать как надо. Помогите реализовать советник. И объясните пожалуйста в чем моя ошибка. Основная ошибка мне кажется содержится в пятом блоке. Принцип работы таков: основной сигнал - это пробитие уровня -50, противоположную позицию (лок) открываем только в том случае, если до нынешнего сигнала,(начало отсчета прошлое пробитие wprом уровня -50) wpr не входил в одну из зон - >-20 или <-80. Раскрываяется лок соответственно и вхождением wpr в одну из этих зон и при этом закрываем соответсвующию позицию и соответсвующую оставляем.

Заранее благодарен.

Код:

//+------------------------------------------------------------------+
//|														  WPR.mq4 |
//|					  Copyright © 2008, aftar Minus			 . |
//|										http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2008, Minus."
#property link	  "http://www.metaquotes.net"
//+------------------------------------------------------------------1a--
extern int Period_WPR=34;			 // период WPR
extern double Lots=0.1;			   // используемый лот
extern double Prots=0.01;			 // Процент свободных средств
//-------------------------------------------------------------------1b--
bool   Work=true;					 // Эксперт будет работать.
string Symb;						  // Название финанс. инструмента
//-------------------------------------------------------------------2---
int start()
 {
 int Total;							  //количество ордеров в окне
 int Tip=-1;							 // Тип выбран. ордера (B=0,S=1)
 int Ticket;							 // Номер ордера
 
 double Wpr_t;							   //текущее значение WPR
 double Lot;								// Колич. лотов в выбран.ордере
 double Lts;								// Колич. лотов в открыв.ордере
 double Min_Lot;							// Минимальное количество лотов
 double Step;							   // Шаг изменения размера лота
 double Free;							   // Текущие свободные средства
 double One_Lot;							// Стоимость одного лота
 double Price;							   // Цена выбранного ордера
 
 bool Ans=false;						// Ответ сервера после закрытия
 bool Cls_B=false;						// Критерий для закрытия  Buy
 bool Cls_S=false;						// Критерий для закрытия  Sell
 bool Opn_B=false;						// Критерий для открытия  Buy
 bool Opn_S=false;						// Критерий для открытия  Sell
  bool zone1=true;
  bool zone2=true;
 //--------------------------------------------------------------- 3 --
  // Предварит.обработка
if(Bars<Period_WPR)					   // Недостаточно баров
 {
  Alert("Недостаточно баров в окне. Эксперт не работает.");
  return;								   // Выход из start()
 }
  if(Work==false)							  // Критическая ошибка
 {
  Alert("Критическая ошибка. Эксперт не работает.");
  return;								   // Выход из start()
 }
//--------------------------------------------------------------- 4 --
  // Учёт ордеров
  Symb=Symbol();							   // Название фин.инстр.
  Total=0;									 // Количество ордеров
  for(int i=1; i<=OrdersTotal(); i++)		  // Цикл перебора ордер
 {
  if (OrderSelect(i-1,SELECT_BY_POS)==true) // Если есть следующий
	{									   // Анализ ордеров:
	 if (OrderSymbol()!=Symb)continue;	  // Не наш фин. инструм
	 if (OrderType()>1)					 // Попался отложенный
	   {
		Alert("Обнаружен отложенный ордер. Эксперт не работает.");
		return;							 // Выход из start()
	   }
	 Total++;							   // Счётчик рыночн. орд
	 if (Total>3)						   // Не более одного орд
	   {
		Alert("Несколько рыночных ордеров. Эксперт не работает.");
		return;							 // Выход из start()
	   }
	 Ticket=OrderTicket();				  // Номер выбранн. орд.
	 Tip=OrderType();					// Тип выбранного орд.
	 Price=OrderOpenPrice();			   // Цена выбранн. орд.
	 Lot=OrderLots();					// Количество лотов
	}
 }
//--------------------------------------------------------------- 5 --
  // Торговые критерии
int H=1000;				   // Колич.баров в расчётной истории
  int P=Period_WPR;			// Период расчётной МА

  double WPR=iCustom(NULL,0,"WPR",P,H,0,0,1);
//-------------------------//  
 
 
  if (WPR>-50 && zone1==true)
 {
  Opn_B=true;												  
  Cls_S=true;
  zone1=false;
  zone2=false;					
 } 
else
{		
  if (WPR>-50 && zone1==false && zone2==false)  
   { 
   Opn_B=true;  
	 {
	  if (WPR>-20)
	   { 
	   zone1=true;
	   zone2=false;
	   Cls_S=true;
	   zone1=false;
	   }
	  else
		{
		if (WPR<-80)
		 {
		 zone2=true;
		 zone1=false;
		 Cls_B=true;
		 zone2=false;
		 } 
		}   
	  }
	 }
   }
  if (WPR<-50 && zone2==true)
 {
  Opn_S=true;												  
  Cls_B=true;
  zone2=false;
  zone1=false;					
 } 
else
{		
  if (WPR<-50 && zone2==false && zone1==false)  
   { Opn_S=true;  
	 {
	  if (WPR<-80)
	   { 
	   zone2=true;
	   zone1=false;
	   Cls_B=true;
	   zone2=false;
	   }
	  else
		{
		if (WPR>-20)
		 {
		 zone1=true;
		 zone2=false;
		 Cls_S=true;
		 zone1=false;
		 } 
		}   
	  }
	 }
   } 
//--------------------------------------------------------------- 6 --
// Закрытие ордеров
  while(true)								  // Цикл закрытия орд.
 {
  if (Tip==0 && Cls_B==true)				// Открыт ордер Buy..
	{									   //и есть критерий закр
	 RefreshRates();						// Обновление данных
	 Ans=OrderClose(Ticket,Lot,Bid,5);	  // Закрытие Buy
	 if (Ans==true)						 // Получилось :)
	   {
		Alert ("Закрыт ордер Buy ",Ticket);
		break;							  // Выход из цикла закр
	   }
	 if (Fun_Error(GetLastError())==1)	  // Обработка ошибок
		continue;						   // Повторная попытка
	 return;								// Выход из start()
	}

  if (Tip==1 && Cls_S==true)				// Открыт ордер Sell..
	{									   // и есть критерий закр
	 RefreshRates();						// Обновление данных
	 Ans=OrderClose(Ticket,Lot,Ask,5);	  // Закрытие Sell
	 if (Ans==true)						 // Получилось :)
	   {
		Alert ("Закрыт ордер Sell ",Ticket);
		break;							  // Выход из цикла закр
	   }
	 if (Fun_Error(GetLastError())==1)	  // Обработка ошибок
		continue;						   // Повторная попытка
	 return;								// Выход из start()
	}
  break;									// Выход из while
 }
//--------------------------------------------------------------- 7 --
  // Стоимость ордеров
  RefreshRates();							  // Обновление данных
  Min_Lot=MarketInfo(Symb,MODE_MINLOT);		// Миним. колич. лотов 
  Free=AccountFreeMargin();				 // Свободн средства
  One_Lot=MarketInfo(Symb,MODE_MARGINREQUIRED);// Стоимость 1 лота
  Step=MarketInfo(Symb,MODE_LOTSTEP);	   // Шаг изменен размера

  if (Lots>0)								// Если заданы лоты,то 
  Lts=Lots;								// с ними и работаем 
  else										 // % свободных средств
  Lts=MathFloor(Free*Prots/One_Lot/Step)*Step;// Для открытия

  if (Lts<Min_Lot) Lts=Min_Lot;			   // Не меньше минимальн
  if (Lts*One_Lot>Free)					  // Лот дороже свободн.
 {
  Alert(" Не хватает денег на ", Lts," лотов");
  return;								   // Выход из start()
 }
//--------------------------------------------------------------- 8 --
// Открытие ордеров
  while(true)								  // Цикл закрытия орд.
 {
  if (Total==0 && Opn_B==true)			  // Открытых орд. нет +
	{									   // критерий откр. Buy
	 RefreshRates();						// Обновление данных		 
	 Ticket=OrderSend(Symb,OP_BUY,Lts,Ask,2,0,0);//Открытие Buy
	 if (Ticket>0)						// Получилось :)
	   {
	   zone1=true;
		Alert ("Открыт ордер Buy ",Ticket);
		return;							 // Выход из start()
	   }
	 if (Fun_Error(GetLastError())==1)	  // Обработка ошибок
		continue;						   // Повторная попытка
	 return;								// Выход из start()
	}
  if (Total==0 && Opn_S==true)			  // Открытых орд. нет +
	{									   // критерий откр. Sell
	 RefreshRates();						// Обновление данных
	 Alert("Попытка открыть Sell. Ожидание ответа..");
	 Ticket=OrderSend(Symb,OP_SELL,Lts,Bid,2,0,0);//Открытие Sel
	 if (Ticket>0)						// Получилось :)
	   {
	   zone1=true;
		Alert ("Открыт ордер Sell ",Ticket);
		return;							 // Выход из start()
	   }
	 if (Fun_Error(GetLastError())==1)	  // Обработка ошибок
		continue;						   // Повторная попытка
	 return;								// Выход из start()
	}
  break;									// Выход из while
 }
//--------------------------------------------------------------- 9 --
  return;									  // Выход из start()
 }

//-------------------------------------------------------------- 10 --
int Fun_Error(int Error)						// Ф-ия обработ ошибок
 {
  switch(Error)
 {										  // Преодолимые ошибки			
  case  4: Alert("Торговый сервер занят. Пробуем ещё раз..");
	 Sleep(3000);						   // Простое решение
	 return(1);							 // Выход из функции
  case 135:Alert("Цена изменилась. Пробуем ещё раз..");
	 RefreshRates();						// Обновим данные
	 return(1);							 // Выход из функции
  case 136:Alert("Нет цен. Ждём новый тик..");
	 while(RefreshRates()==false)		   // До нового тика
		Sleep(1);						   // Задержка в цикле
	 return(1);							 // Выход из функции
  case 137:Alert("Брокер занят. Пробуем ещё раз..");
	 Sleep(3000);						   // Простое решение
	 return(1);							 // Выход из функции
  case 146:Alert("Подсистема торговли занята. Пробуем ещё..");
	 Sleep(500);							// Простое решение
	 return(1);							 // Выход из функции
	 // Критические ошибки
  case  2: Alert("Общая ошибка.");
	 return(0);							 // Выход из функции
  case  5: Alert("Старая версия терминала.");
	 Work=false;							// Больше не работать
	 return(0);							 // Выход из функции
  case 64: Alert("Счет заблокирован.");
	 Work=false;							// Больше не работать
	 return(0);							 // Выход из функции
  case 133:Alert("Торговля запрещена.");
	 return(0);							 // Выход из функции
  case 134:Alert("Недостаточно денег для совершения операции.");
	 return(0);							 // Выход из функции
  default: Alert("Возникла ошибка ",Error); // Другие варианты   
	 return(0);							 // Выход из функции
 }
 }

Ссылка на комментарий
Поделиться на другие сайты

Добрый вечер господа.

У меня просьба - нужен звуковой сигнал на RSI при пересечений уровня 50. Сам я попробовал написать на основе примера в статье "Звуковые сигналы в индикаторах" (http://articles.mql4.com/ru/292) - но увы, багаж знаний мой в части программирования скуден и смешон... Вообщем. кто чем может- помогите.

Ссылка на комментарий
Поделиться на другие сайты

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

void start() {

if(OrderType()==OP_SELL)

{ PlaySound(Sound_1_up);

}

if(OrderType()==OP_BUY)

{ PlaySound(Sound_1_dn);

}}

 

как дальше сделать, Help please!

Изменено пользователем arttom
Ссылка на комментарий
Поделиться на другие сайты

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

void start() {

if(OrderType()==OP_SELL)

{ PlaySound(Sound_1_up);

}

if(OrderType()==OP_BUY)

{ PlaySound(Sound_1_dn);

}}

 

как дальше сделать, Help please!

скорее, не "дальше", а перед. :wink:

 

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

Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...
Помогите, пожалуйста, как можно в советнике сделать следующее: нужно открыть два отложенных ордера по очереди (так как я понимаю, что одновремменно два открыть нельзя, если ошибаюсь, то поправте), один buy, другой sell(кол-во лотов одинаковое) и в случае срабатывания одного из них, тут же удалить второй!!!
Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...
Здравствуйте! Сегодня написал свой первый советник. Прогоняю его на тестере стратегий и вижу, что он открывает по несколько одинаковых сделок (по одной и той же цене) в один и тот же момент времени. Если я правильно понимаю, то происходит это из-за того, что код советника выполняется при получении каждого нового тика, которых на одном баре приходит множество (советник тестирую на пятиминутном графике). Подскажите пожалуйста как избежать этого эффекта. Видимо надо сделать как-то так, чтобы алгоритм выполнялся по одному разу на каждый бар? И как это реализовать технически?
Ссылка на комментарий
Поделиться на другие сайты


×
×
  • Создать...