[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 47

 

Уважаемые специалисты форума, которые тоже когда-то почти ничего не понимали.

Я пробую написать в качестве тренировки простейший советник, с применением индикатора Parabolic Sar. Действие его предполагается элементарным: если цена была ниже значения Сар, а потом стала выше, то надо купить, именно при пересечении ценой значения индикатора и именно один раз свыставлением стоп-лосса и тейк-профита по 10 пунктов. А если наоборот, то продать.

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

Собственно сам вопрос: как заставить советника заключать только одну сделку при появлении таких условий, а не их бесконечное множество?

Вот код моего советника.

//+------------------------------------------------------------------+
//|                                    Current_sar_value_summary.mq4 |
//|                                         Орлов Денис Владимирович |
//|                                                 orlovkem@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Орлов Денис Владимирович"
#property link      "orlovkem@mail.ru"

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
                     //объявляем переменные
   double _sar_value; //текущий уровень Сар
   double _price;       //текущий уровень цены
   int _ticket;      //возвращает количество открытых позиций
   
   _sar_value=iSAR(0,0,0.02,0.2,0);//приравнял переменную _sar_value к текущему значению индикатора Сар
   _price=Bid;                      //приравнял переменную _price к текущему уровню цены Бид
   
   //описываем условие покупки: если уровень цены был ниже значения сар
   if(_price<_sar_value)
           {
           if(_price>=_sar_value)// а потом стал выше, то покупаем
                {
                   Alert("Надо покупать");
                   _ticket=OrderSend(Symbol(),OP_BUY,1,Ask,1,Bid-10*Point,Ask+10*Point,NULL,0,0,Red);
                     
                          Print("OrderSend failed with error #",GetLastError());
                           return(0);
                 
                }
                 return(0);
           }
 
         
   if(_price>_sar_value)//описываем условие покупки: если уровень цены был выше значения сар
         {
           if(_price<=_sar_value)// а потом стал ниже, то продаем
            {
                   Alert("Надо продавать");
                   _ticket=OrderSend(Symbol(),OP_SELL,1,Bid,1,Ask+10*Point,Bid-10*Point,NULL,0,0,Red);
                     
                          Print("OrderSend failed with error #",GetLastError());
                           return(0);
                   
            }
            return(0);
            
         }
   
//----
   return(0);
  }
//+------------------------------------------------------------------+

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

С уважением, Орлов Денис.

 
orlovkem >>:

Уважаемые специалисты форума, которые тоже когда-то почти ничего не понимали.

Я пробую написать в качестве тренировки простейший советник, с применением индикатора Parabolic Sar. Действие его предполагается элементарным: если цена была ниже значения Сар, а потом стала выше, то надо купить, именно при пересечении ценой значения индикатора и именно один раз свыставлением стоп-лосса и тейк-профита по 10 пунктов. А если наоборот, то продать.

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

Собственно сам вопрос: как заставить советника заключать только одну сделку при появлении таких условий, а не их бесконечное множество?

Вот код моего советника.

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

С уважением, Орлов Денис.

а где у вас превидущее значение индикатора? (в какой переменной сохранили...?) то же самое с значений цены

double _sar_value; //текущий уровень Сар
   double _price;       //текущий уровень цены

 
lascu.roman >>:

а где у вас превидущее значение индикатора? (в какой переменной сохранили...?) то же самое с значений цены

Дело в том, что предыдущее значение индикатора расположено на предыдущей свече, а цена пересекает значение индикаторана на текущей свече.

Так же и с ценой, что значит "предыдущее значение цены", цена предыдущего тика? или закрытия предыдущей свечи, но это не то.

Я понимаю что что-то я должен добавить, но что именно понять не могу. Помогите пожалуйста, это первый опыт.

С уважением, Орлов Денис.

 
orlovkem >>:

Дело в том, что предыдущее значение индикатора расположено на предыдущей свече, а цена пересекает значение индикаторана на текущей свече.

Так же и с ценой, что значит "предыдущее значение цены", цена предыдущего тика? или закрытия предыдущей свечи, но это не то.

Я понимаю что что-то я должен добавить, но что именно понять не могу. Помогите пожалуйста, это первый опыт.

С уважением, Орлов Денис.

Ты понял, что сказал, то? У тебя проверяется значение в данное время

 if(_price<_sar_value)
           {
           if(_price>=_sar_value)// а потом стал выше, то покупаем

Два взаимоисключающих условия. Когда он потом стал выше?

 
Roger >>:

Ты понял, что сказал, то? У тебя проверяется значение в данное время

Два взаимоисключающих условия. Когда он потом стал выше?

 if(_price<_sar_value)
           {
           if(_price>=_sar_value)// а потом стал выше, то покупаем

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

 
xruss >>:

а если в истории был ордер Sell, а затем его эксперт закрыл (в типе истории он (его закрытие) отображается как t/p или s/l - не будет ли он считаться последним? не смог добиться нужного эффекта((

Если ордер (buy или sell) закрыт последним (эксперт его закрыл, или сработал t/p или s/l) и проходит по условиям

if(OrderSymbol()==Symbol()){
  if(OrderMagicNumber()==MagicNumber){

то, соответственно, он и будет считаться последним. А какого конкретно эффекта не можете добиться?
 
Everlost >>:

Если ордер (buy или sell) закрыт последним (эксперт его закрыл, или сработал t/p или s/l) и проходит по условиям

if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MagicNumber){

то, соответственно, он и будет считаться последним. А какого конкретно эффекта не можете добиться?

да, наверное это потому, что я исключил из кода OrderMagicNumber()

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

((

 
xruss писал(а) >>

да, наверное это потому, что я исключил из кода OrderMagicNumber()

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

((

Самый простой способ контролировать количество одновременно открытых ордеров

if(OrdersTotal()<1){

   .................
   .................
   условия установки ордеров 

}
 
goldtrader >>:

Читайте описание функции OrderSend( ... )

Магический номер (магик) назначается ордеру при его отсылке на сервер.

Применяется в основном для идентификации отложенных ордеров/позиций.

Т.е. чтобы советник не трогал "чужие" ордера. Назначает его советник или скрипт.

Вручную магик выставить невозможно. Правила Вы определяете сами в эксперте/скрипте.

Чаще магик бывает статический, но можно сделать и динамический если нужно.

Посмотрите несколько простых примеров из кодобазы - должно стать понятно.

А почему нельзя идентифицировать "свои" ордера, по номеру тикета. Они то точно уникальны, хоть сколько советников работает.

Открыл например советник ордер, запомнил тикет, закрыл - забыл.

 
mukata >>:

А почему нельзя идентифицировать "свои" ордера, по номеру тикета. Они то точно уникальны, хоть сколько советников работает.

Открыл например советник ордер, запомнил тикет, закрыл - забыл.

Чубайс вырубит электричество и ищи потом свищи где свои, а где чужие.
Причина обращения: