[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 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()."