MetaTrader <sup>®</sup> 4 build 157 - страница 4

 
Как-то странно работает Изменение Ордеров.
По идее логика должна быть такой:
При изменении, например, длинной позиции
для S/L на кнопке копировать Цена = Bid - Уровень, но не менее 5 пунктов
для T/P на кнопке копировать Цена = Bid + Уровень, но не менее 5 пунктов.
И соответственно при изменении короткой позиции.

А имеем следующее:
для S/L Цена = Bid - Уровень - 5
для T/P Цена = Bid + Уровень + 1

Что это за арифметика ?
 
При открытом MT 4 часто не открываются другие программы, ссылаясь на критическую. ошибку, например Advanced GET, подключенный к Omega Global Server.
 
Во - первых: зачем мне сохранять то, что мне не надо? Ну , покопался я в профиле Евры, не сохранил ничего и открыл пофиль Австралийца - а там засели Фунты. Если учесть, что эти пофили я делал на работе, а домой перетащил по e-mail и нормально потом открыл - в чем моя криворукость? Поэтому надо написать большими буквами : СНАЧАЛА СОХРАНИТЕ ПРОФИЛЬ, ПОТОМ ЕГО НЕ ТРОГАЙТЕ!. Вообще!
А во-вторых: если я открыл пофиль Евро, что-то в нем поделал(НЕ СОХРАНЯЯ - ну не нужно мне это было), а потом открыл профиль Австралийца - это криминал что-ли?

всё дело в том, что (я повторяю) при изменении количественного и качественного состава графиков эти изменения автоматически фиксируются в текущем профиле. и это не зависит от Вашего желания.
"покопался я в профиле Евры, не сохранил ничего" - терминал сохранил без Вашего участия.
" и открыл пофиль Австралийца - а там засели Фунты" - это означает, что Вы, находясь в текущем профиле австралийца, переделывали графики на фунты. Вы ничего не сохраняли - терминал делал это за Вас. когда Вы сохранили фунтовый профиль, Вы просто его размножили - у Вас стало 2 одинаковых профиля (до тех пор, пока Вы фунтовый профиль не начали менять.

поэтому я ещё раз повторяю: СНАЧАЛА СДЕЛАЙТЕ СЕБЕ НУЖНОЕ КОЛИЧЕСТВО ПРОФИЛЕЙ (любых, хоть пустых), ПОТОМ ОТКРЫВАЙТЕ ИХ И СПОКОЙНО МЕНЯЙТЕ


Спасибо за ответы, Renat и Slawa. Я пришел примерно к этим же выводам, что вы мне ответили. Буду теперь осторожен. Только один момент мне непонятен. Объясню:
Я действительно вчера брал первый же попавшийся профиль (пусть это будет "AUDUSD", хотя мне кажется что это был профиль "EURUSD"), закрывал все чарты в этом профиле, потом открывал график (пусть будет "GPBUSD"), затем "USDJPY", затем "GPBJPY".
На все эти три графика я набрасывал шаблон "D1", размещал их красиво - слева вверху Фунт, слева внизу Йена и справа на полокна ФунтоЙена. И только потом я сохранял то, что у меня получилось как профиль "GBP-JPY-GBPJPY". А когда я открыл профиль "AUDUSD" - там вместо четырех графиков было три, все они были на дефолтном шаблоне, все были размещены каскадом друг на друге и все были по Фунту. Кстати, сейчас открыл этот злополучный профиль "GBP-JPY-GBPJPY" - а там Евра и Йена в часовках в своих размерах и опять на дефолтном шаблоне, и только окно "EURJPY" в тааком виде, как я бы сохранил, не будь это профил по ФунтоЙене.
В общем, не знаю что и думать , вчера не пил. Тему эту больше поднимать не буду, может у меня какие-то траблы...
 
2 Slawa
вообще-то функция ArraySort имеет 4(четыре) параметра. и режим возрастания-убывания указывается четвёртым параметром, а не вторым или третьим

Согласен. Пробовать не буду. Приму на веру, что работает правильно, при указании всех 4-х параметров. Но и Вы тоже согласитесь, что, практически, в 99% случаев сортируется весь массив.
В связи с этим:
int ArraySort( double& array[], int count=WHOLE_ARRAY, int start=0, int sort_dir=MODE_ASCEND)


логичнее переделать на:

int ArraySort( double& array[], int sort_dir=MODE_ASCEND, int count=WHOLE_ARRAY, int start=0)


Тем более, что умолчальные значения уже заданы. Да и с точки зрения логики правильней. Да и сама логика прекрасно коррелируется с логикой других операторов таких, например, как Highest и Lowest. И, кстати, в примере-то в хелпе как "нарисовано"?

double num_array[5]={4,1,6,3,9};
// now array contains values 4,1,6,3,9
ArraySort(num_array);
// now array is sorted 1,3,4,6,9
ArraySort(num_array,MODE_DESCEND);
// now array is sorted 9,6,4,3,1

 
avm, мы ещё раз пересмотрим наши функции и у некоторых из них (в том числе ArraySort) уберём параметры по умолчанию.
 
Подскажите, что не так ?

..............
/---- indicator variables
int     NumBars, TickFlag, handle;
double  prevBid;
datetime lastTime;

//+------------------------------------------------------------------+
//| indicator initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
   ...............
   TickFlag = 0;
   NumBars = Bars;
   prevBid = Bid;
   lastTime = CurTime();
   ..............

//---- initialization done
   return(0);
}



Переменные prevBid и lastTime никак не инициализируются.
Так и остаются на нуле. Хотя NumBars инициализируется
действительным значением Bars.

 
Переменные prevBid и lastTime никак не инициализируются.
Так и остаются на нуле. Хотя NumBars инициализируется
действительным значением Bars.

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


Это значит, что инициализацию надо вставлять в start() ?
То есть в start() будет кусок, который выполнится только один раз,
но об который программа будет спотыкаться каждый тик.

Я правильно понимаю ?
Может есть другие варианты ?
 
Может есть другие варианты ?

конечно есть. проинициализировать prevBid и lastTime любыми значениями. можно воспользоваться глобальными переменными. можно взять Close[0] и Time[0].
 
проинициализировать prevBid и lastTime любыми значениями. можно воспользоваться глобальными переменными. можно взять Close[0] и Time[0].


Спасибо, понял. Это подойдет.

К слову, Bid - это ведь тоже глобальная переменная.
Если уж есть функция init(), то по идее это именно ее задача -
проинициализировать ВСЕ глобальные переменные и
функции системы еще до начала работы индикатора или
эксперта, и даже до инициализации их переменных.

Я не раз встречал в примерах и в чужих программах
в функции start() куски, которые выполняются только
один раз. Это нельзя назвать хорошим стилем програмирования.
Но видно не от хорошей жизни. :-)

И в моем случае проблема возникала и тогда, когда я
цеплял индикатор на уже работающий график. В этот момент
уже все было известно.