Да, кстати, такой расклад грамотнее в реализации. Тока в старте больше стало занимать места сопутствующая функция. Вышло так:
Оптимизировать вроде как нечего нельзя, верно?
Я имею ввиду то, что гораздо удобнее, когда в старте вообще мало что есть. А всё вызывается сугубо функциями. А последний раз вышло так, что в старте много всяких наростов на основные функции и переборов дополнительных...
А зачем массив по ссылке передаём, если в функции используете имя массива, объявленного глобально? Мож так надыть:
void FindOrders(int &massive[])
{
int oType;
ArrayInitialize(massive, 0);
for (int i=OrdersTotal() - 1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != i_magic) continue;
oType = OrderType();
massive[oType] = massive[oType] + 1;
}
}
Да и чуть сократить мона:
void FindOrders(int &massive[])
{
ArrayInitialize(massive, 0);
for (int i=OrdersTotal() - 1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != i_magic) continue;
massive[OrderType()] = massive[OrderType()] + 1;
}
}
А насчёт вызова из старта и вывода сообщений. Мне кажется чего-то там намудрили. Не видно функции pr(), посему и подсказать-то нечего...
У себя, для проверки количества ордеров в тестере, по-быстренькому так сделал, особо не замудряясь:
У меня тут продолжается стопор с закрытием требуемых позиций. Суть такая:
1. Отслеживается закрытие позиций.
2. Как только закрылась последняя позиция по тейку... требуется закрыть все открытые и отложенные позиции сразу. Закрывается всё отсортировано по лотам т.е. сразу большие лоты, а дальше меньшие. Ситуация сугубо для набраться опыта работы с ордерами.
Реализация такая:
в start() на каждом тике:
for (int ord=OrdersTotal()-1; ord>=0; ord--)
{
if (!OrderSelect(ord,SELECT_BY_POS)) continue;
if (OrderMagicNumber() != i_magic) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderType() == 6) continue;
g_ticket = OrderTicket();
g_type = OrderType();
// Блок модификации ордеров
if (i_sl != 0 || i_tp != 0)
{
if (OrderStopLoss() == 0 && OrderTakeProfit() == 0)
{
OrdersModifyer(g_ticket);
}
}
// Закрытие всех ордеров, если последний ордер закрыт
if (isCloseByTakeLastOpenPos(2))
{
// if (g_type < 2)
{
ClosePosBySortLots();
}
//else
if (g_type > 1)
{
DeletePendingOrders(g_ticket);
}
}
}
На интересует закрытие рыночных ордеров, т.к. отложенный удаляется как требуется. Вот что имеем:
//+-------------------------------------------------------------------------------------+//| Получаем состояние последней позиции (Открыта или закрыта) |//+-------------------------------------------------------------------------------------+bool isCloseByTakeLastOpenPos(int delta)
{
datetime lastOrderCloseTime = -1, // Время закрытия последнего открытого ордера
lastOOTHist = -1; // Время открытия последнего открытого ордера из историиint j = -1;
pr ("Запустилась функция isCloseByTakeLastOpenPos");
for (int i=OrdersHistoryTotal()-1; i>=0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
if (OrderMagicNumber() != i_magic) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderType() > 1) continue; // Все удалённые отложки нас не интересуют..if (lastOrderCloseTime < OrderCloseTime()) // Находим время закрытия..
{
lastOrderCloseTime = OrderCloseTime(); // ..последней закрытой позиции в истории
j = i;
pr ("j = " + j + " " + TimeToStr(TimeCurrent()));
}
}
if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY))
{
if (OrderProfit() + OrderCommission() + OrderSwap() <= 0) return (false);
// pr ("OTP() = " + OrderTakeProfit() + "; OCP() " + OrderClosePrice() + " " + TimeToStr(TimeCurrent()));// pr ("OOP() = " + OrderOpenPrice() + "; OCP() " + OrderClosePrice() + " " + TimeToStr(TimeCurrent()));if (MathAbs(OrderTakeProfit() - OrderClosePrice()) > delta * pt) return (false);
else
{
lastOOTHist = OrderOpenTime();
Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
"\n", "j = ", j,
"\n", "lastOOTHist = ", TimeToStr(lastOOTHist, TIME_SECONDS));
}
}
else
{
Comment("\n", "FUNC isCloseByTakeLastOpenPos: ",
"\n", "j = ", j,
"\n", "не удалось выбрать ордер в истории");
return(false);
}
for(int h=OrdersTotal()-1; h>=0; h--)
{
if (OrderSelect(h, SELECT_BY_POS, MODE_TRADES))
{
if (OrderMagicNumber() != i_magic) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderType() > 1) continue;
if (lastOOTHist < OrderOpenTime()) return(false); // Выбранная рыночная позиция открыта позже закрытой по тейку
}
else {Print("FUNC isCloseByTakeLastOpenPos : не удалось выбрать рыночный ордер");return(false);}
}
return (true);
}
//+-------------------------------------------------------------------------------------+//| Закрытие ордеров, отсортированных по размеру лотов |//+-------------------------------------------------------------------------------------+void ClosePosBySortLots()
{
double a[][2];
int p = 0;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) continue;
if (OrderMagicNumber() != i_magic) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderType() < 2)
{
p++;
ArrayResize(a, p);
a[p-1][0] = OrderLots();
a[p-1][1] = OrderTicket();
}
}
pr ("ClosePosBySortLots(): " + "p = " + p);
if (p > 0)
{
ArraySort(a, WHOLE_ARRAY, 0, MODE_DESCEND);
for(i=0; i<p; i++)
{
if (OrderSelect(a[i][1], SELECT_BY_TICKET, MODE_TRADES))
{
if (OrderCloseTime() == 0) ClosePosBySelect();
}
}
}
}
//+-------------------------------------------------------------------------------------+//| Закрытие одного, предварительно выбранного ордера |//+-------------------------------------------------------------------------------------+void ClosePosBySelect()
{
bool fc;
color clClose, clCloseBuy = Blue, clCloseSell = Red;
double ll, pa, pb, pp;
int err, it, NumberOfTry = 3;
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
{
for (it=1; it<=NumberOfTry; it++)
{
while (!IsTradeAllowed()) Sleep(5000);
RefreshRates();
pa = MarketInfo(OrderSymbol(), MODE_ASK);
pb = MarketInfo(OrderSymbol(), MODE_BID);
if (OrderType() == OP_BUY)
{
pp = pb; clClose = clCloseBuy;
}
else
{
pp = pa; clClose = clCloseSell;
}
ll = OrderLots();
fc = OrderClose(OrderTicket(), ll, pp, 30, clClose);
if (fc)
{
break;
}
else
{
err = GetLastError();
}
}
}
elsePrint("Некорректная торговая операция. Close ");
}
Почему-то не закрывается часть ордеров. Принтую некоторые сегменты когда, не чего не понятно. Вот например:
В коменте видно, что lastOOTHist = 01:30:00, хотя, на самом деле, это не есть верно. Ведь последние закрытые ордера, если прогортать в окне результы увидим вот что:
Вообще то да, логично. Тока у Вас тут тоже по ссылке передаётся..:)) У меня это было осталось после прошлого раза, когда параметры были не глобальны.
Я утверждал, что массив сюда нужно передать по ссылке. Иначе функция обречена работать только с одним, жестко заданным массивом. Пусть он у вас и задан глобально.
Доброго дня!
Помогите пожалуйста и обьясните почему не работает-торгует советник?
Да, кстати, такой расклад грамотнее в реализации. Тока в старте больше стало занимать места сопутствующая функция. Вышло так:
Оптимизировать вроде как нечего нельзя, верно?
Я имею ввиду то, что гораздо удобнее, когда в старте вообще мало что есть. А всё вызывается сугубо функциями. А последний раз вышло так, что в старте много всяких наростов на основные функции и переборов дополнительных...
А зачем массив по ссылке передаём, если в функции используете имя массива, объявленного глобально? Мож так надыть:
Да и чуть сократить мона:
А насчёт вызова из старта и вывода сообщений. Мне кажется чего-то там намудрили. Не видно функции pr(), посему и подсказать-то нечего...
У себя, для проверки количества ордеров в тестере, по-быстренькому так сделал, особо не замудряясь:
Можно весь вывод завернуть в функцию, которая будет считывать данные из массива и по-человечески объектами выводить информацию.
Доброго дня!
Помогите пожалуйста и обьясните почему не работает-торгует советник?
Потому что здесь не все телепаты и не все провидцы!
Понятно!
я про то что может какие настройки или еще чего надо?
А зачем массив по ссылке передаём, если в функции используете имя массива, объявленного глобально? Мож так надыть:
Вообще то да, логично. Тока у Вас тут тоже по ссылке передаётся..:)) У меня это было осталось после прошлого раза, когда параметры были не глобальны.
А по поводу функции pr. Вот она:
Понятно!
я про то что может какие настройки или еще чего надо?
А я про то что тут навряд ли есть телепаты, а если и есть, то попробуй их заинтересуй на такие подвиги.. Угадать и Помочь...
А я про то что тут навряд ли есть телепаты, а если и есть, то попробуй их заинтересуй на такие подвиги.. Угадать и Помочь...
У меня тут продолжается стопор с закрытием требуемых позиций. Суть такая:
1. Отслеживается закрытие позиций.
2. Как только закрылась последняя позиция по тейку... требуется закрыть все открытые и отложенные позиции сразу. Закрывается всё отсортировано по лотам т.е. сразу большие лоты, а дальше меньшие. Ситуация сугубо для набраться опыта работы с ордерами.
Реализация такая:
в start() на каждом тике:
for (int ord=OrdersTotal()-1; ord>=0; ord--) { if (!OrderSelect(ord,SELECT_BY_POS)) continue; if (OrderMagicNumber() != i_magic) continue; if (OrderSymbol() != Symbol()) continue; if (OrderType() == 6) continue; g_ticket = OrderTicket(); g_type = OrderType(); // Блок модификации ордеров if (i_sl != 0 || i_tp != 0) { if (OrderStopLoss() == 0 && OrderTakeProfit() == 0) { OrdersModifyer(g_ticket); } } // Закрытие всех ордеров, если последний ордер закрыт if (isCloseByTakeLastOpenPos(2)) { // if (g_type < 2) { ClosePosBySortLots(); } //else if (g_type > 1) { DeletePendingOrders(g_ticket); } } }На интересует закрытие рыночных ордеров, т.к. отложенный удаляется как требуется. Вот что имеем:
Почему-то не закрывается часть ордеров. Принтую некоторые сегменты когда, не чего не понятно. Вот например:
В коменте видно, что lastOOTHist = 01:30:00, хотя, на самом деле, это не есть верно. Ведь последние закрытые ордера, если прогортать в окне результы увидим вот что:
их время закрытия другие...
Что здесь не так?
Вообще то да, логично. Тока у Вас тут тоже по ссылке передаётся..:)) У меня это было осталось после прошлого раза, когда параметры были не глобальны.
Жаль, что понадобилось в конце недели, но спрошу.
Есть у кого опыт кодом прочесть сообщение на почтовом ящике от известного отправителя?