Блин переработал ( вобщем ошибка заключалась в том, что я ордера открывал вручную )) естественно без магика, а в условие стоит сравнение с магиком. Нда надо отдыхать побольше.
В этом коде есть ещё несколько косячков, например не показывает сколько ордеров было до, доработаю не забуду если так выложу.
Блин переработал ( вобщем ошибка заключалась в том, что я ордера открывал вручную )) естественно без магика, а в условие стоит сравнение с магиком. Нда надо отдыхать побольше.
В этом коде есть ещё несколько косячков, например не показывает сколько ордеров было до, доработаю не забуду если так выложу.
тут проще
Ну я бы не сказал чтоб прям так проще, у меня 1 массив всего используется. Да и код выглядит только большим.
вот теперь выполняет то что от него и требуется, считает типы ордеров, их профит и общий профит в пунктах, в валюте депозита.
PS: Для тестов, проверка магика была закоментирована.
//------------------- Входные параметры советника -------------------+
extern int MagicNumber = 95293;
//------------------ Глобальные переменные советника ----------------+
double Data_Orders[31][12]; // Массив учёта ордеров.
//--------------------- Подключаемые библиотеки ---------------------+
#include <stdlib.mqh> // Стандартная библиотека МТ4
//+------------------------------------------------------------------+
//| #############--- expert initialization function ---############# |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| ###########--- expert deinitialization function ---############# |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| ##############--- expert start function ---#################### |
//+------------------------------------------------------------------+
int start()
{
//---------------- Проверка флагов советника ------------------------+
//----------------- Variable Initialization -------------------------+
double prew_op_buy, prew_op_sell, prew_bs, prew_ss;
string st;
//----
// Заполняем массив данными выставленных ордеров.
// [0][0 - количество открытых ордеров BUY]
// [0][1 - количество открытых ордеров SELL]
// [0][2 - предыдущее кол-во открытых ордеров BUY]
// [0][3 - предыдущее кол-во открытых ордеров SELL]
// [0][4 - количество отложенных ордеров Buy Stop]
// [0][5 - количество отложенных ордеров Sell Stop]
// [0][6 - предыдущее кол-во отложенных ордеров ордеров Buy Stop]
// [0][7 - предыдущее кол-во отложенных ордеров ордеров Sell Stop]
// [0][8 - общий профит в пунктах позиций Buy]
// [0][9 - общий профит в пунктах позиций Sell]
// [0][10 - общий профит в валюте депозита позиций Buy]
// [0][11 - общий профит в валюте депозита Sell]
//
// [1][0 - курс откр. ордера (абсолютное знач. курса)]
// [1][1 - StopLoss ордера (абсолютное знач. курса)]
// [1][2 - TakeProfit ордера (абсолютное знач. курса)]
// [1][3 - Ticket order]
// [1][4 - колич. лотов ордера (абсолютное знач. курса)]
// [1][5 - тип ордера 1=Buy,2=Sell,3=BuyLimit,4=SellLimit,5=BuyStop,6=SellStop]
// [1][6 - Magic number]
// [1][7 - Профит ордера в пунктах]
if(OrdersTotal() > 0) {
prew_op_buy = Data_Orders[0][0]; // Сохраняем в переменные, предыдущее кол-во открытых ордеров.
prew_op_sell = Data_Orders[0][1];
prew_bs = Data_Orders[0][4];
prew_ss = Data_Orders[0][5];
ArrayInitialize(Data_Orders,0);
for(int i = 0; i<OrdersTotal(); i++)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == true){
//if(OrderMagicNumber() == MagicNumber) {
switch(OrderType()) {
case OP_BUY: Data_Orders[0][0] ++; break;
case OP_SELL: Data_Orders[0][1] ++; break;
case OP_BUYSTOP: Data_Orders[0][4] ++; break;
case OP_SELLSTOP: Data_Orders[0][5] ++; break;
}
Data_Orders[i+1][0] = NormalizeDouble(OrderOpenPrice(), Digits);
Data_Orders[i+1][1] = NormalizeDouble(OrderStopLoss(), Digits);
Data_Orders[i+1][2] = NormalizeDouble(OrderTakeProfit(), Digits);
Data_Orders[i+1][3] = OrderTicket();
Data_Orders[i+1][4] = OrderLots();
Data_Orders[i+1][5] = OrderProfit();
Data_Orders[i+1][6] = OrderType();
Data_Orders[i+1][7] = OrderMagicNumber();
if(OrderType() == OP_BUY) {
Data_Orders[i+1][8] = (Bid - Data_Orders[i+1][0])/Point; // Профит в пунктах ордера Buy
Data_Orders[0][8] = Data_Orders[0][8] + Data_Orders[i+1][8]; // Общий профит в пунктах Buy;
Data_Orders[0][10] = Data_Orders[0][10] + Data_Orders[i+1][5]; // Общий профит в валюте депозита Buy;
}
if(OrderType() == OP_SELL) {
Data_Orders[i+1][8] = (Data_Orders[i+1][0] - Ask)/Point; // Профит в пунктах ордера Sell
Data_Orders[0][9] = Data_Orders[0][9] + Data_Orders[i+1][8]; // Общий профит в пунктах Sell
Data_Orders[0][11] = Data_Orders[0][11] + Data_Orders[i+1][5]; // Общий профит в валюте депозита Sell;
}
//}
}
}
//Помещаем в массив предыдущее кол-во ордеров.
Data_Orders[0][2] = prew_op_buy;
Data_Orders[0][3] = prew_op_sell;
Data_Orders[0][6] = prew_bs;
Data_Orders[0][7] = prew_ss;
}
else ArrayInitialize(Data_Orders,0); // Если ордеров нет, то обнуляем массив.
//---- Блок вывода информации.
st = "\n количество открытых ордеров Buy: " + DoubleToStr(Data_Orders[0][0], Digits)
+"\n количество открытых ордеров Sell: " + DoubleToStr(Data_Orders[0][1], Digits)
+"\n предыдущее кол-во открытых ордеров Buy: " + DoubleToStr(Data_Orders[0][2], Digits)
+"\n предыдущее кол-во открытых ордеров Sell: " + DoubleToStr(Data_Orders[0][3], Digits)
+"\n количество отложенных ордеров Buy Stop: " + DoubleToStr(Data_Orders[0][4], Digits)
+"\n количество отложенных ордеров Sell Stop: " + DoubleToStr(Data_Orders[0][5], Digits)
+"\n предыдущее кол-во отложенных ордеров ордеров Buy Stop: " + DoubleToStr(Data_Orders[0][6], Digits)
+"\n предыдущее кол-во отложенных ордеров ордеров Sell Stop: " + DoubleToStr(Data_Orders[0][7], Digits)
+"\n общий профит позиций Buy: " + DoubleToStr(Data_Orders[0][8], Digits)
+"\n общий профит позиций Sell: " + DoubleToStr(Data_Orders[0][9], Digits)
+"\n общий профит в валюте позиций Buy: " + DoubleToStr(Data_Orders[0][10], Digits)
+"\n общий профит в валюте позиций Sell: " + DoubleToStr(Data_Orders[0][11], Digits)
+"\n Количество ордеров: " + OrdersTotal()
;
Comment(st);
//----
return(0);
}
//+------------------------------------------------------------------+
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Уже весь код перерыл, написано вроде как правильно, но работать не хочет, вообще не понимаю уже ничего (
ошибка скорей всего глупая какая нибудь ( но сам победить не могу.
вот сам код, должен учитывать ордера.
PS: Пробовал смотреть цены ордеров, их он тоже в массив не помещает, ни цены, ни лоты.