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

 

При работе с числами типа double в случае, когда необходимо присвоить переменной какое-то значение (например ноль), у разных авторов встречаются различные варианты написания. Например так a=0; или так a=0.0; или так a=0.0000; Есть ли какое-нибудь отличие с точки зрения корректной работы программы?

 

if ((OrderSymbol()==Symbol()) && ((OrderMagicNumber()==44) || (OrderMagicNumber()==55)) && (ticket==0)){

OrderDelete(OrderTicket());

int err1=GetLastError();

Print(err1);}

С недавних пор этот кусок кода прекрасно работал...теперь возвращается ошибка ERR_OFF_QUOTES. Прошу заметить ошибку возвращает OrderDelete, даже если номер тикета прописать руками. Кто нибудь может прояснить ситуацию? Спасибо.

 
Elenn:

При работе с числами типа double в случае, когда необходимо присвоить переменной какое-то значение (например ноль), у разных авторов встречаются различные варианты написания. Например так a=0; или так a=0.0; или так a=0.0000; Есть ли какое-нибудь отличие с точки зрения корректной работы программы?


Нет, правила нет. Но лично я предпочитаю писать константные значения double используя точку.

Например:

if ( a == 1.0 )
{}

// ...

b = 3.0;

Во-первых, при просмотре текста беглым взглядом видно, что тип значения double.

Во-вторых, это избавляет от некоторых ошибок. Сравните:

double a=2/3;
double b=2.0/3.0;

Print("a=",a," b=",b);
 

Помогите плиз. Не хочет выполнять код:

int start()
{
int pre12;
{
if(PRICE_CLOSE>PRICE_OPEN)
pre12=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,"",Bid-100*Point,Ask+100*Point,CLR_NONE);
}
return;

}

Т.е., как задумывалось, если свеча восходящая - открываемся.

Все компилируется. Но ничего не происходит при тесте. Т.е никаких ордеров не выставляет. Ткните носом в ошибку, плиз...

 
NaVolne:

Помогите плиз. Не хочет выполнять код:

int start()
{
int pre12;
{
if(PRICE_CLOSE>PRICE_OPEN)
pre12=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,"",Bid-100*Point,Ask+100*Point,CLR_NONE);
}
return;

}

Т.е., как задумывалось, если свеча восходящая - открываемся.

Все компилируется. Но ничего не происходит при тесте. Т.е никаких ордеров не выставляет. Ткните носом в ошибку, плиз...

Какая свеча вы не уточнили? текущая на графике? предыдущая дневная? предыдущая недельная? если предыдущая дневная например...выглядело бы это так например:

if(iOpen(NULL,1440,1)<iClose(NULL,1440,1)) в хелпе про iOpen/iClose доступно всё описано

 
NaVolne:

Помогите плиз. Не хочет выполнять код:

int start()
{
int pre12;
{
if(PRICE_CLOSE>PRICE_OPEN)
pre12=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,"",Bid-100*Point,Ask+100*Point,CLR_NONE);
}
return;

}

Т.е., как задумывалось, если свеча восходящая - открываемся.

Все компилируется. Но ничего не происходит при тесте. Т.е никаких ордеров не выставляет. Ткните носом в ошибку, плиз...

Дело всё в том, что PRICE_CLOSE и PRICE_OPEN - это константы, а не функции и также не массивы тайм-серий. Чтобы получить значения цены открытия и закрытия свечей нужно обратиться к функциям (iOpen и iClose) или же к массивам тайм-серий (Open и Close).

Чтобы узнать подробнее, читайте учебник, например, в этом разделе расписано про предопределённые переменные (куда входят массивы тайм-серий, нужные Вам, Open и Close).

 
Elenn:

При работе с числами типа double в случае, когда необходимо присвоить переменной какое-то значение (например ноль), у разных авторов встречаются различные варианты написания. Например так a=0; или так a=0.0; или так a=0.0000; Есть ли какое-нибудь отличие с точки зрения корректной работы программы?

Я так понимаю, что в случае:

double a = 1;

компилятор воспринимает "1", как значение типа int и выполняется приведение типов (int в целевой тип double).

А в случае:

double a = 1.0

или (разницы уже нет)

double a = 1.0000

компилятор воспринимает "1.(xxxx)", как значение типа double и приведение типов не выполняется.


P.S.: спасибо PapaYozh за пример. Мысли, изложенные выше пришли именно после него.

И Я так понимаю, что компилятору проще, когда он не приводит типы лишний раз? А может и в ex4 прописываются строчки с "не приведёнными" типами? То есть падает быстродействие? Хотя компилятор должен по идее оптимизировать код.

Пусть более опытные Программисты MQL4 Меня поправят...

 
Спасибо за мега-развернутые ответы. Читаю, вникаю.
 
NaVolne:
Спасибо за мега-развернутые ответы. Читаю, вникаю.
Учебник нужно читать, а не Наши ответы! :)) От корочки до корочки естественно.
 
LexAlex:

С недавних пор этот кусок кода прекрасно работал...теперь возвращается ошибка ERR_OFF_QUOTES. Прошу заметить ошибку возвращает OrderDelete, даже если номер тикета прописать руками. Кто нибудь может прояснить ситуацию? Спасибо.

Может находится в уровне заморозки. Может что-то со счетом и брокер из-за частых операций на счете прекратил поток.
Причина обращения: