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

 
silhouette:

Не сочтите за тормоза, впервые имею дело с многомерными массивами :)

Ориетироваться будет проще, если представить многомерный массив как нечто иное. А именно: если найти для массива модель, которая отражает его суть - модель легче держать перед глазами.

Одномерный массив - это объекты на линии (координатный луч, начинающийся с нуля). Примером такого массива может служить очередь в магазине. Первый на очереди - это тот, кто стоит сразу за человеком, который сейчас покупает. Покупающего же нельзя назвать первым в очереди - он покупает - он нулевой. Он находится внутри нулевой ячейки одномерного массива.

Двумерный массив - это объекты в плоскости (координатная плоскость). Примером может быть зрительный зал. Такой-то ряд, такое-то место. Добавьте к этой модели нулевой ряд и нулевое место и Вы получите точную модель двумерного массива.

Трёхмерный массив - это объекты в пространстве (координатное пространство) - координата объекта задаётся тремя величинами. Это куб, с разграфлёнными гранями. Моделью может служить жилой дом, в котором есть подъезд номер ноль, этаж номер ноль и квартира номер ноль (помимо всех прочих). При условии, что в каждом подъезде нумерация квартир начинается с нуля.

Четырёхмерный массив - это подобие одномерного массива. Это координатный луч, все точки которого - трёхмерные массивы. Модель - улица. Коорданата будет задаваться величинами: номер дома, номер подъезда, номер этажа, номер квартиры.

Ну и так далее в энн-мерность - от улиц переходим к районам, от районов города, от районов к городам, от городов к странам, от стран к планетам...

 
GarKain:
может кто-нибудь обьяснит как сделать так что бы открываемый ордер мог открываться в любо момент бара а следуюший только на следующем баре?

Проходим циклом по списку ордеров. Если время открытия очередного ордера больше или равно времени открытия текущего бара (Time[0]), то устанавливаем флаг, запрещающий открывать ордера на данной валютной паре. На селдующей свечке цикл обнаружит, что такого ордера нет и не поставит запрета - то есть, снимет флаг запрета открытия ордеров.
 
drknn:

Проходим циклом по списку ордеров. Если время открытия очередного ордера больше или равно времени открытия текущего бара (Time[0]), то устанавливаем флаг, запрещающий открывать ордера на данной валютной паре.
аааа спасибо большое
 
drknn, большое спасибо за разъяснение. Сохраню ;)
 
GarKain:
аааа спасибо большое


Если код работает только по одной валютной паре, то поставьте отсеивание ордеров других пар строкой

if(OrderSymbol()!=Symbol()){continue;}
 
drknn:


Если код работает только по одной валютной паре, то поставьте отсеивание ордеров других пар строкой

вопрос. если код работает по нескольким валютным парам и одновременно по нескольким таймфреймам можно ли поставить на них разные магик номера и производить отсев по нему?
 

Можно.

if(OrderMagicNumber()!=MAGIC) { continue;}
 
drknn:

Можно.



bool Times=true;
if (OrdersTotal()>0){
for(int g=OrdersTotal()-1; g>=0; g--){
datetime t;
OrderSelect(g,SELECT_BY_POS);
if (OrderMagicNumber()!=MagicNumber){continue;}
if (t<OrderOpenTime() || g==OrdersTotal()-1) t=OrderOpenTime();

if (t>=Time[0]) Times=false;}}


вот так правильно?

 
GarKain:

bool Times=true;
if (OrdersTotal()>0){
for(int g=OrdersTotal()-1; g>=0; g--){
datetime t;
OrderSelect(g,SELECT_BY_POS);
if (OrderMagicNumber()!=MagicNumber){continue;}
if (t<OrderOpenTime() || g==OrdersTotal()-1) t=OrderOpenTime();

if (t>=Time[0]) Times=false;}}


вот так правильно?


Нет. Не нужно внутри цикла на каждой его итерации объявлять переменную.

bool Torg=true;
for(int i=OrdersTotal()-1;i>=0;i--){
    if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {Print("Ошибка № ",GetLastError()," при выборе ордера № ",i);}
    else {
     if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGIC) { continue;} 
     if(OrderOpenTime()>=Time[0]){
       Torg=false;
     }
   }  
 }


// теперь используем результат работы цикла
// Если есть сигнал и торг разрешён, то открываем ордер
 
GarKain:

bool Times=true;
if (OrdersTotal()>0){
for(int g=OrdersTotal()-1; g>=0; g--){
datetime t;
OrderSelect(g,SELECT_BY_POS);
if (OrderMagicNumber()!=MagicNumber){continue;}
if (t<OrderOpenTime() || g==OrdersTotal()-1) t=OrderOpenTime();

if (t>=Time[0]) Times=false;}}


вот так правильно?

нет заметил ошибку.

bool Times=true;
datetime t=Time[1];
if (OrdersTotal()>0){
for(int g=OrdersTotal()-1; g>=0; g--){
OrderSelect(g,SELECT_BY_POS);
if (OrderMagicNumber()!=MagicNumber){continue;}
if (t<OrderOpenTime()) t=OrderOpenTime();

if (t>=Time[0]) Times=false;}}


вот так правильно?

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