Уважаемые специалисты форума, которые тоже когда-то почти ничего не понимали.
Я пробую написать в качестве тренировки простейший советник, с применением индикатора 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);}//+------------------------------------------------------------------+
Прошу Вас помочь разобраться, обещаю что когда стану гуру, не пройду мимо просьб таких же чайников как я.
Уважаемые специалисты форума, которые тоже когда-то почти ничего не понимали.
Я пробую написать в качестве тренировки простейший советник, с применением индикатора Parabolic Sar. Действие его предполагается элементарным: если цена была ниже значения Сар, а потом стала выше, то надо купить, именно при пересечении ценой значения индикатора и именно один раз свыставлением стоп-лосса и тейк-профита по 10 пунктов. А если наоборот, то продать.
Вся беда в том, что он и покупает и продает, но делает это постоянно пока есть свободные средства на депозите, а не один раз. Т.е. как только цена поднялась выше значения Сар он покупает постоянно пока цена выше, а как только цена опускается ниже Сар продает все время пока цена находится ниже.
Собственно сам вопрос: как заставить советника заключать только одну сделку при появлении таких условий, а не их бесконечное множество?
Вот код моего советника.
Прошу Вас помочь разобраться, обещаю что когда стану гуру, не пройду мимо просьб таких же чайников как я.
С уважением, Орлов Денис.
а где у вас превидущее значение индикатора? (в какой переменной сохранили...?) то же самое с значений цены
double _sar_value;//текущий уровень Сарdouble _price;//текущий уровень цены
Ты понял, что сказал, то? У тебя проверяется значение в данное время
Два взаимоисключающих условия. Когда он потом стал выше?
if(_price<_sar_value)
{
if(_price>=_sar_value)// а потом стал выше, то покупаем
может быть неправильно сформулировал комментарий, но суть остается верна, уровень цены стал выше значения индикатора, надо купить и он покупает, но надо сделать это один раз, а советние покупает до тех пор пока на депозите имеются деньги. Нужно просто ограничить количество сделок. Сделать не больше одной за раз, вот это и не получается.
а если в истории был ордер Sell, а затем его эксперт закрыл (в типе истории он (его закрытие) отображается как t/p или s/l - не будет ли он считаться последним? не смог добиться нужного эффекта((
Если ордер (buy или sell) закрыт последним (эксперт его закрыл, или сработал t/p или s/l) и проходит по условиям
то, соответственно, он и будет считаться последним. А какого конкретно эффекта не можете добиться?
да, наверное это потому, что я исключил из кода OrderMagicNumber()
я хочу сделать так, чтобы у меня не открывались ордера повторно после закрытия. В условиях невозможно описать, чтобы после того как поступил сигнал на открытие Buy, а потом на его закрытие, сново не открывался бы Buy (дело в том, что порой еще сохраняются условия на его открытие). с sell таже самая история. я подумал, что будет круто, если в условиях указать, если был бай и была прибыль - не открывать снова бай. а он пока что открывает- мерзавец!)))
да, наверное это потому, что я исключил из кода OrderMagicNumber()
я хочу сделать так, чтобы у меня не открывались ордера повторно после закрытия. В условиях невозможно описать, чтобы после того как поступил сигнал на открытие Buy, а потом на его закрытие, сново не открывался бы Buy (дело в том, что порой еще сохраняются условия на его открытие). с sell таже самая история. я подумал, что будет круто, если в условиях указать, если был бай и была прибыль - не открывать снова бай. а он пока что открывает- мерзавец!)))
((
Самый простой способ контролировать количество одновременно открытых ордеров
if(OrdersTotal()<1){
.................
.................
условия установки ордеров
}
Уважаемые специалисты форума, которые тоже когда-то почти ничего не понимали.
Я пробую написать в качестве тренировки простейший советник, с применением индикатора Parabolic Sar. Действие его предполагается элементарным: если цена была ниже значения Сар, а потом стала выше, то надо купить, именно при пересечении ценой значения индикатора и именно один раз свыставлением стоп-лосса и тейк-профита по 10 пунктов. А если наоборот, то продать.
Вся беда в том, что он и покупает и продает, но делает это постоянно пока есть свободные средства на депозите, а не один раз. Т.е. как только цена поднялась выше значения Сар он покупает постоянно пока цена выше, а как только цена опускается ниже Сар продает все время пока цена находится ниже.
Собственно сам вопрос: как заставить советника заключать только одну сделку при появлении таких условий, а не их бесконечное множество?
Вот код моего советника.
Прошу Вас помочь разобраться, обещаю что когда стану гуру, не пройду мимо просьб таких же чайников как я.
С уважением, Орлов Денис.
Уважаемые специалисты форума, которые тоже когда-то почти ничего не понимали.
Я пробую написать в качестве тренировки простейший советник, с применением индикатора Parabolic Sar. Действие его предполагается элементарным: если цена была ниже значения Сар, а потом стала выше, то надо купить, именно при пересечении ценой значения индикатора и именно один раз свыставлением стоп-лосса и тейк-профита по 10 пунктов. А если наоборот, то продать.
Вся беда в том, что он и покупает и продает, но делает это постоянно пока есть свободные средства на депозите, а не один раз. Т.е. как только цена поднялась выше значения Сар он покупает постоянно пока цена выше, а как только цена опускается ниже Сар продает все время пока цена находится ниже.
Собственно сам вопрос: как заставить советника заключать только одну сделку при появлении таких условий, а не их бесконечное множество?
Вот код моего советника.
Прошу Вас помочь разобраться, обещаю что когда стану гуру, не пройду мимо просьб таких же чайников как я.
С уважением, Орлов Денис.
а где у вас превидущее значение индикатора? (в какой переменной сохранили...?) то же самое с значений цены
а где у вас превидущее значение индикатора? (в какой переменной сохранили...?) то же самое с значений цены
Дело в том, что предыдущее значение индикатора расположено на предыдущей свече, а цена пересекает значение индикаторана на текущей свече.
Так же и с ценой, что значит "предыдущее значение цены", цена предыдущего тика? или закрытия предыдущей свечи, но это не то.
Я понимаю что что-то я должен добавить, но что именно понять не могу. Помогите пожалуйста, это первый опыт.
С уважением, Орлов Денис.
Дело в том, что предыдущее значение индикатора расположено на предыдущей свече, а цена пересекает значение индикаторана на текущей свече.
Так же и с ценой, что значит "предыдущее значение цены", цена предыдущего тика? или закрытия предыдущей свечи, но это не то.
Я понимаю что что-то я должен добавить, но что именно понять не могу. Помогите пожалуйста, это первый опыт.
С уважением, Орлов Денис.
Ты понял, что сказал, то? У тебя проверяется значение в данное время
Два взаимоисключающих условия. Когда он потом стал выше?
Ты понял, что сказал, то? У тебя проверяется значение в данное время
Два взаимоисключающих условия. Когда он потом стал выше?
if(_price<_sar_value) { if(_price>=_sar_value)// а потом стал выше, то покупаемможет быть неправильно сформулировал комментарий, но суть остается верна, уровень цены стал выше значения индикатора, надо купить и он покупает, но надо сделать это один раз, а советние покупает до тех пор пока на депозите имеются деньги. Нужно просто ограничить количество сделок. Сделать не больше одной за раз, вот это и не получается.
а если в истории был ордер Sell, а затем его эксперт закрыл (в типе истории он (его закрытие) отображается как t/p или s/l - не будет ли он считаться последним? не смог добиться нужного эффекта((
Если ордер (buy или sell) закрыт последним (эксперт его закрыл, или сработал t/p или s/l) и проходит по условиям
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MagicNumber){
Если ордер (buy или sell) закрыт последним (эксперт его закрыл, или сработал t/p или s/l) и проходит по условиям
if(OrderSymbol()==Symbol()){
if(OrderMagicNumber()==MagicNumber){
да, наверное это потому, что я исключил из кода OrderMagicNumber()
я хочу сделать так, чтобы у меня не открывались ордера повторно после закрытия. В условиях невозможно описать, чтобы после того как поступил сигнал на открытие Buy, а потом на его закрытие, сново не открывался бы Buy (дело в том, что порой еще сохраняются условия на его открытие). с sell таже самая история. я подумал, что будет круто, если в условиях указать, если был бай и была прибыль - не открывать снова бай. а он пока что открывает- мерзавец!)))
((
да, наверное это потому, что я исключил из кода OrderMagicNumber()
я хочу сделать так, чтобы у меня не открывались ордера повторно после закрытия. В условиях невозможно описать, чтобы после того как поступил сигнал на открытие Buy, а потом на его закрытие, сново не открывался бы Buy (дело в том, что порой еще сохраняются условия на его открытие). с sell таже самая история. я подумал, что будет круто, если в условиях указать, если был бай и была прибыль - не открывать снова бай. а он пока что открывает- мерзавец!)))
((
Самый простой способ контролировать количество одновременно открытых ордеров
if(OrdersTotal()<1){ ................. ................. условия установки ордеров }Читайте описание функции OrderSend( ... )
Магический номер (магик) назначается ордеру при его отсылке на сервер.
Применяется в основном для идентификации отложенных ордеров/позиций.
Т.е. чтобы советник не трогал "чужие" ордера. Назначает его советник или скрипт.
Вручную магик выставить невозможно. Правила Вы определяете сами в эксперте/скрипте.
Чаще магик бывает статический, но можно сделать и динамический если нужно.
Посмотрите несколько простых примеров из кодобазы - должно стать понятно.
А почему нельзя идентифицировать "свои" ордера, по номеру тикета. Они то точно уникальны, хоть сколько советников работает.
Открыл например советник ордер, запомнил тикет, закрыл - забыл.
А почему нельзя идентифицировать "свои" ордера, по номеру тикета. Они то точно уникальны, хоть сколько советников работает.
Открыл например советник ордер, запомнил тикет, закрыл - забыл.