сравнение балансов

 

Здравствуйте, уважаемые форумчане!

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

Итак, проблема в следующем: необходимо через каждые 2 ордера сравнивать баланс счета до этих 2 ордеров и после них. А далее исходя из разницы корректировать торговлю.

Извиняйте, если колхоз получился далее. Но нижеследующее не работает.

bool TradeProfit()

{

double AccBalance=50000;

bool balance=false;


if(CalculateCurrentOrders(Symbol())==0)

{

if (AccBalance<=AccountBalance()) balance=true;

if (AccBalance<AccountBalance()) balance=false;

}

return(balance);

}

 

забыл еще присвоение перед return

AccBalance=AccountBalance() .

что в этой идее не верно

 
Если последние два ордера (точнее сказать 2 позиции) закрыты, почему бы вам не сделать перебор OrdersHistoryTotal и смотреть на результат этих двух ордеров. Так я думаю будет легче.
 

Спасибо за ответ.

Что-то вроде этого ?

int OrdersProfit()

{

int orders=OrdersHistoryTotal();

double LastOrder=0;

double PrelastOrder=0;

int TradeUP=0;

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

{

OrderSelect(orders-1,SELECT_BY_POS,MODE_HISTORY);

LastOrder=OrderProfit();

OrderSelect(orders-2,SELECT_BY_POS,MODE_HISTORY);

PrelastOrder=OrderProfit();

if ((LastOrder+PrelastOrder)>=0) TradeUP=0;

else TradeUP++;

}

return(TradeUP);

}


 
Jequile:

забыл еще присвоение перед return

AccBalance=AccountBalance() .

что в этой идее не верно


У вас там опечатка, потому и косячит:

 if(CalculateCurrentOrders(Symbol())==0)
  {
   if (AccBalance<=AccountBalance()) balance=true;
   if (AccBalance < AccountBalance()) balance=false;  // здесь косяк
  }

Поменяйте знак "<" на ">" и идея заработает.

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

 
Jequile:

Спасибо за ответ.

Что-то вроде этого ?

int OrdersProfit()

{

int orders=OrdersHistoryTotal();

double LastOrder=0;

double PrelastOrder=0;

int TradeUP=0;

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

{

OrderSelect(orders-1,SELECT_BY_POS,MODE_HISTORY);

LastOrder=OrderProfit();

OrderSelect(orders-2,SELECT_BY_POS,MODE_HISTORY);

PrelastOrder=OrderProfit();

if ((LastOrder+PrelastOrder)>=0) TradeUP=0;

else TradeUP++;

}

return(TradeUP);

}



Ну в принципе думаю работать будет, НО... мне кажется вам нужна проверка на Symbol, на OrderType (отмененный отложенник может все спутать), на MagicNumber воспользуйтесь тем что другие уже сделали и отладили https://www.mql5.com/ru/forum/131859/page4#434231 на этой странице есть функция Кима isLossLastPos.
 

Да наверно просто вставил косо или когда правил код при написании сообщения опечатку допустил. В любом случае OrderSend error 4051; invalid lots amount for OrderSend function.

там далее просто эту функция используется для изменения лота (типа мартина) так что хз. С ордерами нужно попробовать по отдельности, хотя код из сообщения 3 моего тоже не работал. Я пробовал уже)

 
предыдущий пост относится к сообщению MetaDriver'a.
 
Хорошо спасибо pro.
 

Вот так лучше будет

#define MAGIC 12345678
int start(){
 int N=2;
 Print("Профит последних ",N," ордеров=",NOrdersProfit(N));
}
double NOrdersProfit(int n=999999999){ // Возвращает суммарный профит n последних закрытых ордеров.
 int orders=OrdersHistoryTotal();
 int LastClosedCounted=0;
 double LastNOrdersProfit=0;
 for (int i=orders-1;i>=0;i--) {
  if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {
   if(OrderMagicNumber()==MAGIC) {
    if(LastClosedCounted >= n) break;
    else {LastNOrdersProfit=+OrderProfit();LastClosedCounted++;}
   }
  }
 }
 if(LastClosedCounted<n) Print("В истории всего лишь ",LastClosedCounted," Ордеров c магиком ",MAGIC);
 return(LastNOrdersProfit);
}
 

Так действительно будет лучше. Четко и красиво. Только вот это верно или опечатка?

else {LastNOrdersProfit=+OrderProfit();LastClosedCounted++;}


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