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

 
VAM_ 08.06.2010 18:48правка | удалить

Как отключить звук? Довёл до белого коленья. Окон инструментоа много (33). Никаких советников нет. Одни средние и Zup. Откуда он поёт не могу понять. Умоляю, помогите. В сервисе, событиях был. Крестики на событиях не помогают. Всё поёт, гадина.

Techno:


скворец может в индюке сидеть )))

Просмотрел код - нигде нет никаких алертов! Что делать?
 
VAM_:

Просмотрел код - нигде нет никаких алертов! Что делать?

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

Мне нужно для частичного закрытия позиции переменной Part, заданной на глобальном уровне, присваивать определённые значения и передавать их как параметр функции, которая выполняет частичное закрытие ордера. Эта переменная является простым делителем. Т.е., при изначально заданном ей значении 1, лот делится на 1 и закрывается вся позиция. При изменении условий торговли, эта переменная получает новые значения и может равняться, допустим 1.5, или 2, тогда лот позиции делится на это число и выполняется частичное закрытие. Вызов функции с передачей параметра выглядит дословно так:

// На глобальном уровне
double Part = 1;                           // на сколько разделить лот для частичного закрытия 
//..........

void ClosePartPosBySelect(double Part)    // Объявление функции
// ... тру-ля-ля ... тело функции ...
ll=NormalizeLot((OrderLots()/Part));      // рассчёт лота внутри функции
// ... дальнейший код ф-ции ...

//--------- Вызов функции частичного закрытия ---------
// Происходит из тела этой функции
void TrailingPositionsTLE(int MAGIC, int CloseMethod, double Part, int LastTrailing)
// таким образом:
if (CloseMethod==1)
            ClosePartPosBySelect(Part);

Так вот, несмотря на то, что при вызове функции ...

TrailingPositionsTLE(561, 1, 2, 1);

... задаётся CloseMethod = 1 (частичное закрытие) и указывается явное значение Part = 2, в функцию передаётся не значение Part, заданное по ходу программы (например 2), а изначальное её значение = 1, заданное на глобальном уровне...

Как это победить??? Спасибо...

 
artmedia70: При изменении условий торговли, эта переменная получает новые значения и может равняться, допустим 1.5, или 2, тогда лот позиции делится на это число и выполняется частичное закрытие.  

 

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

int init()

{

.....

GlobalVariableSet("Part0",Part);

.....

}

int start()

...

Part=StrToInteger(GlobalVariableGet("Part0")); 

...

 
Roger:

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

int init()

{

.....

GlobalVariableSet("Part0",Part);

.....

}

int start()

{

...

Part=StrToInteger(GlobalVariableGet("Part0"));

...

}

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

При передаче переменной в функцию, через её параметр, переменная передается по значению, это значит изменения переменной в самой функции не приведет к ее перезаписи.
  Попробуй передать по ссылке, для этого вставь перед именем параметра символ «&»

void simple(string &s){
//                 ^
//       спец сим. & перед именем переменной задает передачу по ссылке, а не по значению
//
}
 
VAM_:

Просмотрел код - нигде нет никаких алертов! Что делать?

На вкладке «События» сбрось галочку «Разрешить».

 

Здравствуйте уважаемые профи.

Очень хочу написать советник который бы открывал  одновременно две сделки Sell и Buy.

Затем по прошествии определенного количества пунктов (параметр lim), убыточный ордер закрывался,

а прибыльный чтоб закрылся тогда когда цена опустится ниже максимальной цены с момента открытия ордера

(своего рода виртуальный трейлинг-стоп).

В ужасных муках родил вот это, но оно них... не работает

Подскажите плиз чтонибудь

int start()
  {
 
  double 
   max, min;                                            
  int b, s;
   if (Bid>max) max=Bid; 
    if (Ask<min) min=Ask;  
       if (OrdersTotal()>0)
       {                                   
           if ((max-Bid)>=lim*Point) 
           {                   
          OrderSelect(b,SELECT_BY_TICKET);                                  
          b=OrderClose(OrderTicket(),0.1,Bid,3,Blue);
          }
          
          
          if ((Ask-min)>=lim*Point)  
          {         
      OrderSelect(s,SELECT_BY_TICKET); 
      s=OrderClose(OrderTicket(),0.1,Ask,3,Red);
         }
}
else
{
  if (OrdersTotal()<1)
  {
 b=OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,"",5,0);
      
 s=OrderSend(Symbol(),OP_SELL,0.1,Bid,5,0,0,"",5,0); 
    }                           
   }
         return;

   return(0);
  }
 
artmedia70:
Как сделать, чтобы можно было переменной, заданной на глобальном уровне по ходу исполнения программы присваивать разные значения при вызове разных функций и она их сохраняла?

два пути

1. в функции, где производится изменение значения добавить амперсант,

например void функция( double& Part ){}

тогда, при изменении значения внутри функции новое значение будет возвращаться в место вызова

2. убрать переменную из списка параметров функции, т.к. переменная задана глобально, то ее значение можно изменять в любом месте кода не передавая ее в качестве параметра..

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


зы. проглядел пост, по сути уже ответили..

 
artmedia70:
 , но её значение, изменённое внутри функций во внешние не возвращается. 


Покажите саму функцию.

Если это void ClosePartPosBySelect(double Part), то поменяйте на

void ClosePartPosBySelect() 

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