Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 672

 
TarasBY:

С этой функцией не работал. Предположение - если терминал однажды символ выделил, то следующая попытка выделения этого же символа может возвращать false. Попробуйте игнорировать проверку возврата этой функцией.

Оказывается, SymbolSelect("AUDUSD", true) возвращает true только если AUDUSD нету в MarketWatch - т.е. при добавлении пары в MarketWatch. Как только пара оказывается в MarketWatch, последующие вызовы возвращают false.

Такое поведение совершенно не состыкуется с мануалом по этой функции. 

 

Пришлось извращаться через самописанную функцию, которая сканирует все SymbolName(i, true) для i=0..SymbolsTotal(true).

 
Mr.Profit:

Оказывается, SymbolSelect("AUDUSD", true) возвращает true только если AUDUSD нету в MarketWatch - т.е. при добавлении пары в MarketWatch. Как только пара оказывается в MarketWatch, последующие вызовы возвращают false.

Такое поведение совершенно не состыкуется с мануалом по этой функции. 

Что-то мне подсказывает, что можно обойтись без SymbolSelect().
 
TarasBY:
Что-то мне подсказывает, что можно обойтись без SymbolSelect().

Да, только что заапдейтал свой пост выше
 
borilunad:

А какой другой, а то уже нужно делать ноги от этого?!


Master Forex

 
laveosa:
я на Альпари 4 месяца сову лепил.....  код нано кванто очень блин трудоёмкий и не маленький..... и что теперь всё !!!!!  обидно .... может всё же что то можно сделать?

Третий сов. и всё та же ошибка, радует что проблема не с кодом :)
 
тут вот какое дело я новый "Нет" поставил  (стоит высокоскоростной стекло волоконный кабель на закачку выдаёт 7мб в сек.)  и после этого понеслась именно с Альпари такая штука, а вот с Мастер Форекс всё ок и Адмерал тоже не матюкаетца .........  вот ещё оди нюанс, брокер установлен на диске D:)    при переустановки ОП системы я новый не устанавливал и пользуюсь старым .... может надо установить?
 
laveosa:


Master Forex

 


Спасибо, посмотрю!
 
borilunad:

Спасибо, посмотрю!

не агитирую просто ответил на вопрос  :)
 

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

 

 

Проблема. На новом тике теряется значение переменной.

Краткое описание. Присваиваем некоторой переменной возвращаемое значение функции OrderSend() и выходим по команде return. На следующем тике значение переменной становится равным нулю.

Ключевой врагмент исходного кода. Полный текст исходника ниже.

if (SAR_Prev>LastClose && SAR_Prev2<LastClose2)
         {
          int ticket_sell=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Ask+StopLoss*Point,Bid-TakeProfit*Point," ",111,0,Red);
          Alert ("Присвоили значение пременной ticket_sell ", ticket_sell);
          return;
         }
      }
     
   Alert ("Существование позиции = ", position_exists, " Ордер на покупку ", ticket_buy, " Ордер на продажу ", ticket_sell);

 

Результат.

Скриншот показывает, что позиция успешно открылась и тикет ордера запомнен в переменной  ticket_sell. Однако на следующем тике переменная ticket_sell становится равной нулю. И я не могу модифицировать/удалять ордер по тикету.

 

 

 

 

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

input double TakeProfit    =2500;
input double StopLoss      =400;
input double Lots          =1;
input double TrailingStop  =100;

input double Parameter1    =0.02; // Параметры индикатора PSAR
input double Parameter2    =0.2;
   
void OnTick()
{
int position_exists; // Переменная, принимающая значения 0 или 1. Указывает, открыта ли позиция по интструменту EURUSD

// Занесение в переменные значений индикатора на последнем и предпоследнем закрывшихся барах  
double SAR_Prev=iSAR(NULL,0,Parameter1,Parameter2,1);
double SAR_Prev2=iSAR(NULL,0,Parameter1,Parameter2,2);
// Занесение в переменные цен закрытия на последнем и предпоследнем барах
double LastClose=iClose(NULL,0,1);
double LastClose2=iClose(NULL,0,2);

  
//---------------------------------------------------------------------     
// Блок, который определяет, открыта ли позиция по инструменту EURUSD
// путём перебора всех открытых ордеров терминала в цикле. 
// Если позиция открыта, то переменной position_exists будет присвоено значение 1
int cnt;
string sym;
int type;

int total=OrdersTotal();
position_exists=0;
for (cnt=0; cnt<=total-1; cnt++)
   {
    bool select=OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
    sym=OrderSymbol();
    type=OrderType();
    if (sym=="EURUSD" && (type==1 || type==0)) 
      {
       position_exists=1;
       break;
      }
   }     
//--------------------------------------------------------------------- 
// Если позиция по EURUSD не существует, то проверяем условия открытия сделки  
   if(position_exists==0)
      {
       if (SAR_Prev<LastClose && SAR_Prev2>LastClose2)
         {
          int ticket_buy=OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Bid-StopLoss*Point,Ask+TakeProfit*Point," ",111,0,Blue);
          Alert ("Присвоили значение пременной ticket_buy ", ticket_buy);
          return;
         }
         
       if (SAR_Prev>LastClose && SAR_Prev2<LastClose2)
         {
          int ticket_sell=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Ask+StopLoss*Point,Bid-TakeProfit*Point," ",111,0,Red);
          Alert ("Присвоили значение пременной ticket_sell ", ticket_sell);
          return;
         }
      }
      
   Alert ("Существование позиции = ", position_exists, " Ордер на покупку ", ticket_buy, " Ордер на продажу ", ticket_sell);
//--------------------------------------------------------------------- 
// Если позиция по EURUSD существует, то проверяем условия закрытия позиции  
   if (position_exists==1)
      {
       if (ticket_sell==0) // Если открытой позиции на продажу нет, то выбираем открытый ордер на покупку по тикету
         {bool select_buy=OrderSelect(ticket_buy,SELECT_BY_TICKET,MODE_TRADES);}
         
       if (ticket_buy==0) // Если открытой позиции на покупку нет, то выбираем открытый ордер на продажу по тикету
         {bool select_sell=OrderSelect(ticket_sell,SELECT_BY_TICKET,MODE_TRADES);}
         
       
       if(OrderType()==OP_BUY) 
         {
          if(SAR_Prev>LastClose && SAR_Prev2<LastClose2) // Проверяем уловия для закрытия длинной позиции
              {
               bool close_buy=OrderClose(OrderTicket(),OrderLots(),Bid,0,Violet);
               return;
              }
         }
        
        
        if(OrderType()==OP_SELL)
         {
          if(SAR_Prev<LastClose && SAR_Prev2>LastClose2) // Проверяем уловия для закрытия короткой позиции
              {
               bool close_sell=OrderClose(OrderTicket(),OrderLots(),Ask,0,Violet);
               return;
              }
          } 
       }
} 

 

 

 
Sergey71:

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

 

 

Проблема. На новом тике теряется значение переменной.

Краткое описание. Присваиваем некоторой переменной возвращаемое значение функции OrderSend() и выходим по команде return. На следующем тике значение переменной становится равным нулю.

Ключевой врагмент исходного кода. Полный текст исходника ниже.

if (SAR_Prev>LastClose && SAR_Prev2<LastClose2)
         {
          int ticket_sell=OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Ask+StopLoss*Point,Bid-TakeProfit*Point," ",111,0,Red);
          Alert ("Присвоили значение пременной ticket_sell ", ticket_sell);
          return;
         }
      }
     
   Alert ("Существование позиции = ", position_exists, " Ордер на покупку ", ticket_buy, " Ордер на продажу ", ticket_sell);

 

Результат.

Скриншот показывает, что позиция успешно открылась и тикет ордера запомнен в переменной  ticket_sell. Однако на следующем тике переменная ticket_sell становится равной нулю. И я не могу модифицировать/удалять ордер по тикету.

 

 

 

 

 

 


Что бы значение не терялось нужна глобальная переменная, вынеси ее объявление за пределы OnTick() или сделай ее статической
Причина обращения: