[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 450

 
T-G:
да последнюю, но суть вопросы была в том что предыдущий ордер закрылся с минусом функция это не успевает показать, сначала открывается ордер проходит пару тиков и только тогда функция показывает что последний убыток но ордер уже открылся. как это преодолеть?
Я написал скелет кода с проверкой
 
я делал так еще раз говорю не успевает проверить сначала проходит как будто нету лося открывается сделка а потом до него доходит что лось был
 
artmedia70:

А почему не использовать параметр отложенного ордера Expiration.

Есть конечно вероятность, что этот параметр нельзя использовать.

На некоторых торговых серверах может быть установлен запрет на применение срока истечения отложенных ордеров. В этом случае при попытке задать ненулевое значение в параметре expiration будет сгенерирована ошибка 147 (ERR_TRADE_EXPIRATION_DENIED).

Тогда конечно только так...

Внес, как Вы советовали, изменения в строку и советник перестал работать...

ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+PriceDistance*Point,3,Ask+PriceDistance*Point-StopLoss*Point,Ask+PriceDistance*Point+TakeProfit*Point,"PD",1,TimeCurrent()+10*60,Green);

При этом знаю точно что запрета нет.

В чем может быть ошибка, подскажите, пожалуйста.

 
T-G:
я делал так еще раз говорю не успевает проверить сначала проходит как будто нету лося открывается сделка а потом до него доходит что лось был
Чудес не бывает. Вам к телепатам...
 
OlegArH:

Внес, как Вы советовали, изменения в строку и советник перестал работать...

ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+PriceDistance*Point,3,Ask+PriceDistance*Point-StopLoss*Point,Ask+PriceDistance*Point+TakeProfit*Point,"PD",1,TimeCurrent()+10*60,Green);

При этом знаю точно что запрета нет.

В чем может быть ошибка, подскажите, пожалуйста.

Работать-то он вряд ли перестал, а вот критерии ваши, скорее всего хромают. Без кода сложно придумать вам причину неработы советника...
 
artmedia70:
Работать-то он вряд ли перестал, а вот критерии ваши, скорее всего хромают. Без кода сложно придумать вам причину неработы советника...

Вот всё что "накрапал" на сей момент:

extern double TakeProfit = 50;
extern double StopLoss=100;
extern double PriceDistance = 50;
extern double Lots = 1;
extern double TrailingStop = 50;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int cnt, ticket, total;

total=OrdersTotal();
if(total<1)
{
ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+PriceDistance*Point,3,Ask+PriceDistance*Point-StopLoss*Point,Ask+PriceDistance*Point+TakeProfit*Point,"PD",1,0,Green);
Sleep (10000);
ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-PriceDistance*Point,3,Bid-PriceDistance*Point+StopLoss*Point,Bid-PriceDistance*Point-TakeProfit*Point,"PD",2,0,Red);
}

for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // check for opened position
OrderSymbol()==Symbol()) // check for symbol
{
if(OrderType()==OP_BUY) // long position is opened
{
// should it be closed?
if(1!=1)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
return(0); // exit
}
// check for trailing stop
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
else // go to short position
{
// should it be closed?
if(1!=1)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
return(0); // exit
}
// check for trailing stop
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
return(0);
}

// the end.

В таком виде пашет.... Но, соответственно, открывает сделки на неопределенное время, гад.

Заранее благодарю!

 
OlegArH:

Вот всё что "накрапал" на сей момент:

extern double TakeProfit = 50;
extern double StopLoss=100;
extern double PriceDistance = 50;
extern double Lots = 1;
extern double TrailingStop = 50;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
int cnt, ticket, total;

total=OrdersTotal();
if(total<1)
{
ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+PriceDistance*Point,3,Ask+PriceDistance*Point-StopLoss*Point,Ask+PriceDistance*Point+TakeProfit*Point,"PD",1,0,Green);
Sleep (10000);
ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-PriceDistance*Point,3,Bid-PriceDistance*Point+StopLoss*Point,Bid-PriceDistance*Point-TakeProfit*Point,"PD",2,0,Red);
}

for(cnt=0;cnt<total;cnt++)
{
OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // check for opened position
OrderSymbol()==Symbol()) // check for symbol
{
if(OrderType()==OP_BUY) // long position is opened
{
// should it be closed?
if(1!=1)
{
OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
return(0); // exit
}
// check for trailing stop
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
return(0);
}
}
}
}
else // go to short position
{
// should it be closed?
if(1!=1)
{
OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
return(0); // exit
}
// check for trailing stop
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
return(0);
}
}
}
}
}
}
return(0);
}

// the end.

В таком виде пашет.... Но, соответственно, открывает сделки на неопределенное время, гад.

Заранее благодарю!


научитесь вставлять код - читайте это все.
 
Roman.:

научитесь вставлять код - читайте это все.

Roman, благодарю за ответ!
У меня дело за малым- заставить робота открывать сделки на время с момента их автоматического открытия.

Например, робот открывая ОТЛОЖЕННУЮ сделку, автоматически выставляет время истечения +600 сек от текущего и всё....

При этом, вариант когда он удаляет их сам не подойдет, поскольку у ДЦ на котором я "тренирубсь" есть ограничение на модификацию отложников если цена подошла ближе чем на 10 пунктов +спред к цене открытия в том числе и еще не открытого ордера.

К тому же, суть в том что если ордер уже открыт- его удалять не надо, надо дать ему "доиграть" и схлопнуться своей "смертью". А если поставить orderdelite, функция ведь будет закрывать и уже сработавшие ордера. (?)

Что касается учебника- ну не программер я по складу, гумманитарий ярковыраженный- рисую, леплю, сочиняю и ни на что более не заточен!)))

Добросовестно пытался вникнуть. Кой чего дошло, а что то- не лезет...

Поэтому я и здесь.....

 
OlegArH:

Roman, благодарю за ответ!
У меня дело за малым- заставить робота открывать сделки на время с момента их автоматического открытия.

Например, робот открывая ОТЛОЖЕННУЮ сделку, автоматически выставляет время истечения +600 сек от текущего и всё....

При этом, вариант когда он удаляет их сам не подойдет, поскольку у ДЦ на котором я "тренирубсь" есть ограничение на модификацию отложников если цена подошла ближе чем на 10 пунктов +спред к цене открытия в том числе и еще не открытого ордера.

К тому же, суть в том что если ордер уже открыт- его удалять не надо, надо дать ему "доиграть" и схлопнуться своей "смертью". А если поставить orderdelite, функция ведь будет закрывать и уже сработавшие ордера. (?)

Что касается учебника- ну не программер я по складу, гумманитарий ярковыраженный- рисую, леплю, сочиняю и ни на что более не заточен!)))

Добросовестно пытался вникнуть. Кой чего дошло, а что то- не лезет...

Поэтому я и здесь.....

Попробуйте словами описать то, что вы тут написали:

extern double TakeProfit = 50;
extern double StopLoss=100;
extern double PriceDistance = 50;
extern double Lots = 1;
extern double TrailingStop = 50;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
   int cnt, ticket, total;

   total=OrdersTotal();
   if(total<1) {
      ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+PriceDistance*Point,3,Ask+PriceDistance*Point-StopLoss*Point,
                       Ask+PriceDistance*Point+TakeProfit*Point,"PD",1,0,Green);
      Sleep (10000);
      ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Bid-PriceDistance*Point,3,Bid-PriceDistance*Point+StopLoss*Point,
                       Bid-PriceDistance*Point-TakeProfit*Point,"PD",2,0,Red);
      }

   for(cnt=0;cnt<total;cnt++) {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&                         // check for opened position
         OrderSymbol()==Symbol()) {                      // check for symbol
         if(OrderType()==OP_BUY) {                       // long position is opened
            if(1!=1) {
               OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
               return(0);                                // exit
               }
                                                         // check for trailing stop
            if(TrailingStop>0) {
               if(Bid-OrderOpenPrice()>Point*TrailingStop) {
                  if(OrderStopLoss()<Bid-Point*TrailingStop) {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                     }
                  }
               }
            }
         else {                                          // go to short position
                                                         // should it be closed?
            if(1!=1) {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
               return(0);                                // exit
               }
                                                         // check for trailing stop
            if(TrailingStop>0) {
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                     }
                  }
               }
            }
         }
      }
   return(0);
}

Лично для меня на самый первый взгляд оказалось головоломкой ваша затея: Если единица не равна единице, то закрыть ордер...

Остальное после этого смотреть не стал...

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

 
OlegArH:

...А если поставить orderdelite, функция ведь будет закрывать и уже сработавшие ордера. (?)

...


Нет. Знакомьтесь внимательней. Сработавший отложенник - становится рыночным - эта ф-ия его никак не касается.

"Удаляет ранее установленный отложенный ордер. Возвращает TRUE при успешном завершении функции. Возвращает FALSE

при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError()."

Причина обращения: