Спрашивайте! - страница 34

 
AnasFX:
Хорошо, это сработало, но теперь проблема в производительности. Проверка всей истории занимает время. Я сделал бэктест за полтора года и заметил, что он медленный. Причина в том, что я проверяю все ордера в истории и сравниваю их цену закрытия и время закрытия. Можно ли как-то ограничить поиск в истории, чтобы он искал только недавние ордера? Могу ли я каким-либо образом увеличить производительность?

вы можете попробовать

OrderSelect(HistoryTotal(),SELECT_BY_POS,MODE_HISTORY);

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

спасибо

 

Приветствую всех...

может ли кто-нибудь помочь мне...

У меня есть индикатор для создания EA....

 
phoenix:
вы можете попробовать

OrderSelect(HistoryTotal(),SELECT_BY_POS,MODE_HISTORY);

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

спасибо

отредактировано по моей вине... это должно быть

OrderSelect(HistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY);

 

Извините за двойное сообщение, но мне действительно нужна помощь...

Я в отчаянии. Я всю ночь пыталась заставить мой массив работать, но ничего не происходит. Я действительно пытался быть самодостаточным и пытаться учиться, но я все еще не могу добраться туда, куда мне нужно. Если кто-то может смилостивиться надо мной и одолжить мне немного помощи....PLEASE!!!!!

Я запускаю скрипт сетки, но хотел бы отслеживать, сколько лотов я запускаю по символу. Я хочу иметь возможность суммировать мою общую позицию по лотам. Допустим, у меня есть 0.10, 0.10, 0.10, 0.10, 0.10, 0.20, 0.30, я хочу знать, что у меня есть эквивалент 0.90 лотов. Я также хотел бы знать минимальный и максимальный размер лота....0.10 и 0.30.

ArrayResize(OrderArray, i);

ArrayInitialize(OrderArray,0);

cnt = 0;

for (i = 0; i < OrdersTotal(); i++)

{

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() )

{

OrderArray[cnt][PROFIT] = OrderProfit() + OrderSwap();

OrderArray[cnt][OPEN] = OrderOpenPrice();

OrderArray[cnt][LOTS] = OrderLots();

if(OrderType() == OP_BUY)

{

////// I can't get anything to work!!!!!!!

BuyLots += OrderArray[cnt][LOTS];

////// This returns Zero when I place BuyLots in my Comments

////// This returns error messages

MaxBuyLots =ArrayMaximum(OrderArray[LOTS],WHOLE_ARRAY,0);

}

 
deeforex:
Извините за двойное сообщение, но мне действительно нужна помощь...

Я в отчаянии. Я всю ночь пытаюсь заставить свой массив работать, но ничего не получается. Я действительно пытался быть самодостаточным и пытаться учиться, но я все еще не могу добраться туда, куда мне нужно. Если кто-то может смилостивиться надо мной и одолжить мне немного помощи....PLEASE!!!!!

Я запускаю скрипт сетки, но хотел бы отслеживать, сколько лотов я запускаю по символу. Я хочу иметь возможность суммировать мою общую позицию по лотам. Допустим, у меня есть 0.10, 0.10, 0.10, 0.10, 0.10, 0.20, 0.30, я хочу знать, что у меня есть эквивалент 0.90 лотов. Я также хотел бы знать минимальный и максимальный размер лота....0.10 и 0.30.

Проблема в том, что arrayresize() изменяет размер только первого элемента, а не второго. Очевидно, что ваши макросы LOTS, PROFIT и OPEN должны быть 0, 1, 2 соответственно. Кроме того, объект count в цикле for имеет значение (i), однако код блока ссылается на (cnt). Попробуйте это и посмотрите, работает ли это.

double OrderArray[][3];

ArrayResize( OrderArray, OrdersTotal() );

cnt = 0;

for (cnt = 0; cnt< OrdersTotal(); cnt++)

{

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() )

{

OrderArray[cnt][PROFIT] = OrderProfit() + OrderSwap();

OrderArray[cnt][OPEN] = OrderOpenPrice();

OrderArray[cnt][LOTS] = OrderLots();

if(OrderType() == OP_BUY)

{

double BuyLots;

BuyLots += OrderArray[cnt][LOTS];

MaxBuyLots =ArrayMaximum(OrderArray);

}

 

Спасибо, Николишен,

Я немного приблизился. BuyLots возвращает то, что я хочу, но ArrayMaximum выдает странное число, которое я не могу понять. Он не возвращает наибольший размер лота.

Я очень благодарен за помощь.

Ди

 
deeforex:
Спасибо Nicholishen,

Я немного приблизился. BuyLots возвращает то, что я хочу, но ArrayMaximum выдает странное число, которое я не могу понять. Он не возвращает наибольший размер лота.

Я очень благодарен за помощь.

dee

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

double OrderArray...[];

ArrayResize( OrderArray, OrdersTotal() );

cnt = 0;

for (cnt = 0; cnt< OrdersTotal(); cnt++)

{

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() )

{

OrderArrayProfit[cnt] = OrderProfit() + OrderSwap();

OrderArrayOpen[cnt] = OrderOpenPrice();

OrderArrayLots[cnt] = OrderLots();

if(OrderType() == OP_BUY)

{

double BuyLots;

BuyLots += OrderArrayLots[cnt];

MaxBuyLots =ArrayMaximum(OrderArrayLots);

}

[/CODE]

or

[CODE]double OrderArray[][3];

ArrayResize( OrderArray, OrdersTotal() );

cnt = 0;

for (cnt = 0; cnt< OrdersTotal(); cnt++)

{

if (OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES) && OrderSymbol() == Symbol() )

{

OrderArray[cnt][PROFIT] = OrderProfit() + OrderSwap();

OrderArray[cnt][OPEN] = OrderOpenPrice();

OrderArray[cnt][LOTS] = OrderLots();

if(OrderType() == OP_BUY)

{

double BuyLots;

BuyLots += OrderArray[cnt][LOTS];

}

double MBL;

for(int i=0;i<OrdersTotal();i++){

if(OrderArrayLots[LOTS]>MBL)MBL=OrderArrayLots[LOTS];

}

MaxBuyLots =MBL;

 

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

int tsTicket[21];

double tsPrice[21];

bool tsok[21];

int tkt3[20];

int SuperClose(){// superclose by nicholishen

int cnp=ordercnt();

for(int i=0;i<cnp;i++){

if(OrderMatch(i)){

if(0==0){//Pulls in order that meets the criteria for processing

int num=0;int pos=0;

for(int b=0;b<21;b++){// this (loopB) compares the ticket# of the selected order against the number stored in the ticket array

if(tsTicket==OrderTicket() ){

num++; pos=b;// if ticket numbers match, pos is the position in the array where the trailing data is stored

break;

}

}

if(num==0){ // if the loopB did not find a matching ticket number it is time to initialize the data

for(int j=0;j<21;j++){

if(tsTicket[j]==0){// this is looking for the earliest instance within the array to store the data

pos=j;

break;

}

}

tsTicket[pos]=OrderTicket();// setting the ticket number

tsok[pos]=false;// this is to determine when trailing kicks in

// Print("(",pos,") New ticket initialized = ",tsTicket[pos]);

}

if (OrderType()==OP_SELL) {

if (!tsok[pos] && (OrderOpenPrice()-Ask>=TSactivation*Point || TSactivation==0 ) ) {// if the trailing factor is false, but it has hit the activation point continue

tsPrice[pos]=Ask+TrailPips*Point;// this is the new trailinf stop price

tsok[pos]=true;// it's ok to proceed with trailing stop

if(TrailPips>8){// if this distance from the current price to the new stop, then modify the order.

ModifyStopLoss(Ask+TrailPips*Point,OrderTakeProfit());//modifies order

}

}

if (tsok[pos] && Ask+TrailPips*Point < tsPrice[pos] ){//if the position is gaining in profit

tsPrice[pos]=Ask+TrailPips*Point;

if(TrailPips>8){

ModifyStopLoss(Ask+TrailPips*Point,OrderTakeProfit());

}

}

if (tsok[pos] && Ask >= tsPrice[pos] ){// if the postion hits the stop price

if(CloseOrder(Ask)==STOP)return(STOP);

Print("Short Order ",tsTicket[pos]," Closed from TS");

}

}

else if (OrderType()==OP_BUY) {// reverse of SELL

if(!tsok[pos] && (Bid-OrderOpenPrice() >= TSactivation*Point || TSactivation==0 ) ) {

tsPrice[pos]=Bid-TrailPips*Point;

tsok[pos]=true;

if(TrailPips>8){

ModifyStopLoss(Bid-TrailPips*Point,OrderTakeProfit());

}

}

if (tsok[pos] && Bid-TrailPips*Point > tsPrice[pos] ){

tsPrice[pos]=Bid-TrailPips*Point;

if(TrailPips > 8){

ModifyStopLoss(Bid-TrailPips*Point,OrderTakeProfit());

}

}

if (tsok[pos] && Bid <= tsPrice[pos] ){

if(CloseOrder(Bid)==STOP)return(STOP);

Print("Long Order ",tsTicket[pos]," Closed from TS");

}

}

}

}

if(RefreshRates())return(STOP);

}

for(i=0;i<21;i++){// this searches the array for ticket numbers that are now obsolete due to an order that has closed

if(tsTicket>0){

bool found=false;

for(b=0;b<OrdersTotal();b++){

OrderSelect(b,SELECT_BY_POS);

if(tsTicket==OrderTicket()){

found=true;

break;

}

}

if(!found){// if there are matching ticket numbers in the trade pool and the array then nothing happens

tsTicket=0;tsPrice=0;tsok=false;// if there is an obolete ticket the the data is reset. And the next new ticket data can occupy this space

// Print("Array pos ",i," Cleaned");

}

}

}

return(0);

}

int ordercnt(){

int c;

for(int i=0;i<OrdersTotal();i++){

if(OrderSelect(i,SELECT_BY_POS)){

if(OrderMagicNumber()==ID && OrderSymbol()==Symbol()){

tkt3[c]=OrderTicket();

c++;

}

}

}

return(c);

}

//+------------------------------------------------------------------+

int curcnt(){

int c;

for(int i=0;i<OrdersTotal();i++){

if(OrderSelect(i,SELECT_BY_POS)){

if(OrderSymbol()==Symbol()){

c++;

return(c);

}

}

}

return(c);

}

//+------------------------------------------------------------------+

bool OrderMatch(int i){

if(OrderSelect(tkt3,SELECT_BY_TICKET)){

if(OrderMagicNumber()==ID && OrderSymbol()==Symbol()){

return(true);

}

}

return(false);

}
 

Еще раз спасибо!

Я изменил 3-ю от последней строки на эту

if(OrderArray[LOTS]>MBL)MBL=OrderArray[LOTS];

и все заработало. Сейчас уже далеко не время для сна. Завтра, когда я проснусь, я изучу логику вашего кода. Но поскольку я упрям, я собираюсь выяснить, как использовать чертову функцию ArrayMaximum!!! Я также должен буду прочитать больше об индексации, чтобы понять, что мои старые способы были настолько неправильными.

Спасибо еще раз!!!!

Ди

 
deeforex:
Еще раз спасибо!

Я изменил 3-ю строку из последней на эту

if(OrderArray[LOTS]>MBL)MBL=OrderArray[LOTS];

и все заработало. Сейчас уже далеко за пределами моего времени сна. Завтра, когда я проснусь, я буду изучать логику вашего кода. Но поскольку я упрям, я собираюсь выяснить, как использовать чертову функцию ArrayMaximum!!! Я также должен буду прочитать больше об индексации, чтобы понять, что мои старые способы были настолько неправильными.

Спасибо еще раз!!!!

Ди

Просто чтобы сэкономить ваше время, причина, по которой функция max не работает для того, что вы хотите, заключается в том, что вы используете многомерный массив и храните различные типы данных. Она вернет максимальное значение из этих данных, поэтому вполне вероятно, что вы возвращали число прибыли или что-то большее, чем ваш РЕАЛЬНЫЙ максимальный размер лота.