Последний раз, когда писал здесь что-то про повышение быстродействия, мне ответили, что незачем себя лишать удобства, т.е. опять я был не прав.
С чем связана такая особая потребность в повышении быстродействия? Не так часто вызывается функция открытия позиции, чтобы это как-то заметно повлияло на тестирование. Если повышение скорости открытия в реале... не знаю на что могут повлиять пол миллисекунды. Очень интересно на что? Если так сражаться за быстродействие, стоит отказаться и от функций, для каждого случая писать включаемые файлы. (Но и на этот тезис мне сечас конечно возразят, что мол компилятор все оптимизирует).
В одном случая придется только перекомпилировать, а в другом делать исправление, но сначала разобраться, в чем же дело. Такая вот небольшая разница.
Проще, чем три строчки: подключить, объявить, вызывать.
Последний раз, когда писал здесь что-то про повышение быстродействия, мне ответили, что незачем себя лишать удобства, т.е. опять я был не прав.
С чем связана такая особая потребность в повышении быстродействия? Не так часто вызывается функция открытия позиции, чтобы это как-то заметно повлияло на тестирование. Если повышение скорости открытия в реале... не знаю на что могут повлиять пол миллисекунды. Очень интересно на что? Если так сражаться за быстродействие, стоит отказаться и от функций, для каждого случая писать включаемые файлы. (Но и на этот тезис мне сечас конечно возразят, что мол компилятор все оптимизирует).
В одном случая придется только перекомпилировать, а в другом делать исправление, но сначала разобраться, в чем же дело. Такая вот небольшая разница.
Проще, чем три строчки: подключить, объявить, вызывать.
Вы правильно заметили: "MQ что-то изменили"...
Если сам написал, то за 2 минуты поймёшь в чём дело!
1) Хочу что бы код работал на демо счете точно так же, как во время тестирования на истории. 2) Прикладываю весь код + оранжевым пометил то, что считаю смысловым.
//+------------------------------------------------------------------+//| My_Practics.mq5 |//+------------------------------------------------------------------+#property copyright"Mike_Kharkov"#property link"https://www.fl.ru/users/Yamaradg/"#property version"1.00"double COEF = 1.0; //коэффициент кратности увеличения лотаint DELTA = 20; //количество пунктов прохода цены для уведичения позицииint counter = 0; //счетчит вызовов функции//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---//---return(INIT_SUCCEEDED);
}//---------------------------------------------------------------------------+//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}//---------------------------------------------------------------------------+//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+voidOnTick()
{
// вызываем функцию вычисления последнего ордера и преобразовываем результат в 5-ти значное число.double last_order = FindLastPrice(ORDER_TYPE_BUY);
int positions_total = PositionsTotal();
//---блок первоначального окрытия позиции по текущей ценеif(PositionsTotal() < 1)
{
double prc = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
counter = 0;
// вызываем функцию, подсчитывающую кол-во лотов для стартовой сделкиdouble trade_lot = function_trade_lot(AccountInfoDouble(ACCOUNT_BALANCE));
// -------+ вызов функции формирования торгового запроса +--------- bool isOpen = SendOrder(prc, trade_lot);
if (isOpen)
{
Print(" Первоначальное открытие ");
if (PositionSelect(Symbol()))
{
double priceOpen = PositionGetDouble(POSITION_PRICE_OPEN);
double posTP = PositionGetDouble(POSITION_TP);
double posProf = PositionGetDouble(POSITION_PROFIT);
double accountMargin = AccountInfoDouble(ACCOUNT_MARGIN_SO_SO);
double accountBalance = AccountInfoDouble(ACCOUNT_BALANCE);
double AccountEquity = AccountInfoDouble(ACCOUNT_EQUITY);
Print(" ");
Print("Количество открытых позиций: ", PositionsTotal());
Print("Цена в сделке, подтверждённая брокером : ", DoubleToString(priceOpen, 5));
Print("Тэйк-Профит позиции : ", DoubleToString(posTP, 5));
Print("Порядковый номер вызова ф-ции: ", counter,"-я функция.");
Print("Текущая прибыль позиции: ", DoubleToString(posProf, 2), " $");
Print("СТОП АУТ: ", DoubleToString(accountMargin, 2), " %");
Print("Баланс аккаунта: ", DoubleToString(accountBalance, 2), " $");
Print("Средства на счете: ", DoubleToString(AccountEquity, 2), " $");
Print(" ");
}
}
return;
}
//---блок наращивания существующей позицииdouble ask = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
double posVolume = PositionGetDouble(POSITION_VOLUME);
// условие для наращивания позицииif(ask <= last_order - DELTA * _Point && PositionsTotal() == 1)
{
double prc = SymbolInfoDouble(Symbol(), SYMBOL_ASK);
//увеличим размер позиции на коэффициентdouble lot = posVolume * COEF;
// -------+ вызов функции формирования торгового запроса +--------- bool isOpen = SendOrder(prc, lot);
if (isOpen)
{
Print(" Увеличение объема позиции ");
Print(" Цена по которой открываем ордер : ", DoubleToString(ask, 5));
Print(" Объем открываемого ордера : ", DoubleToString(lot, 2));
if (PositionSelect(Symbol()))
{
posVolume = PositionGetDouble(POSITION_VOLUME);
double posTP = PositionGetDouble(POSITION_TP);
double posProf = PositionGetDouble(POSITION_PROFIT);
double accountMargin = AccountInfoDouble(ACCOUNT_MARGIN_SO_SO);
double accountBalance = AccountInfoDouble(ACCOUNT_BALANCE);
double AccountEquity = AccountInfoDouble(ACCOUNT_EQUITY);
Print(" ");
Print(" Данные после открытия ордера ");
Print("Количество открытых позиций: ", PositionsTotal());
Print("Оъем открытой позиции после открытия ордера : ", DoubleToString(posVolume, 2));
Print("Тэйк-Профит позиции : ", DoubleToString(posTP, 5));
Print("Цена последней сделки: ", DoubleToString(last_order, 5));
Print("Порядковый номер вызова ф-ции: ", counter,"-я функция.");
Print("Текущая прибыль позиции: ", DoubleToString(posProf, 2), " $");
Print("СТОП АУТ: ", DoubleToString(accountMargin, 2), " %");
Print("Баланс аккаунта: ", DoubleToString(accountBalance, 2), " $");
Print("Средства на счете: ", DoubleToString(AccountEquity, 2), " $");
Print(" ");
}
}
return;
}
//---
}//---------------------------------------------------------------------------+//функция формирующая торговый запрос на открытие позиции -------------------+//и проверки результата открытияbool SendOrder(double price, double volume)
{
if(volume >= 100000){
return(false);
Print("ОШИБКА! Обьем Ордера привысил размер 100-ни лотов и сейчас ровняется", volume,"-м");
};
counter++;
MqlTradeRequest request = {0};
MqlTradeResult result = {0};
//---заполняем поля торгового запроса
request.action = TRADE_ACTION_DEAL; // Тип выполняемого действия
request.symbol = _Symbol; // Имя торгового инструмента
request.volume = volume; // Запрашиваемый объем сделки в лотах
request.price = price; // Цена
request.type = ORDER_TYPE_BUY; // Тип ордера
request.tp = price + 27*_Point; // Цена, по которой сработает Take Profit ордер при движении цены в благоприятном направлении
request.sl = price - 275*_Point; // Цена, по которой сработает Stop Loss ордер при движении цены в неблагоприятном направлении
request.deviation = 1000000; // Максимально приемлемое отклонение от запрашиваемой цены, задаваемое в пунктах
request.type_filling = ORDER_FILLING_IOC; // Тип ордера по исполнению
request.type_time = ORDER_TIME_GTC;//---проверим хватает ли средств для открытия позицииdouble margin = 0.0;
if (!OrderCalcMargin(request.type, request.symbol, request.volume, request.price, margin))
return(false);
if (margin > AccountInfoDouble(ACCOUNT_FREEMARGIN))
return(false);
//---отправка запроса на сервер и проверка результата отправкиif (OrderSend(request,result))
{
return(true);
}
elseAlert("При выставлении ордера произошла ошибка. Error = ",GetLastError());
Print(__FUNCTION__," При выставлении ордера произошла ошибка. Error = ",GetLastError());
return(false);
}//-------------------------------------------------------------------------------------------------+// возвращает цену открытия последнего ордера, где nMode - ORDER_TYPE_BUY/ORDER_TYPE_SELL ----------+// для позиции с идентификатором PositionIDdouble FindLastPrice(int nMode)
{
int CntPos; // количество ордеров в историиulong nTicket; // тикет выбранного ордера из историиulong OldTicket = 0; // тикет ордера найденного ранееlong PosID, PosiID; // идентификатор позиции, к которой относится выбранный ордер//long Magic; // магический номерlong Type; // тип найденного ордера (Buy или Sell)double OrderPrice = 0; // найденная цена// идентификатор позицииif((PosiID = PositionGetInteger(POSITION_IDENTIFIER))==0) return(0.0);
// создадим список ордеров и сделок, находящихся в историиHistorySelect(0, TimeCurrent());
CntPos = HistoryOrdersTotal(); // количество ордеров в истории// переберем все ордеры истории и отберем те, что относятся к нашей открытой позицииfor (int i = 0; i < CntPos; i++)
{
nTicket = HistoryOrderGetTicket(i); // получим тикет очередного ордера
PosID = HistoryOrderGetInteger(nTicket, ORDER_POSITION_ID); // позиция ордера
Type = HistoryOrderGetInteger(nTicket, ORDER_TYPE); // тип ордераif ((PosID == PosiID) && (Type == nMode))
{
if (nTicket > OldTicket) // этот ордер был открыт позже найденного ранее
{
OrderPrice = HistoryOrderGetDouble(nTicket, ORDER_PRICE_OPEN); // цена открытия ордера
OldTicket = nTicket; // запомним тикет
};
};
};
return(OrderPrice);
};//---------------------------------------------------------------------------+// ---- функция подсчета значения стартового лота. ------------------------------+double function_trade_lot(double account_balance ){
double lot = 0.01;
//lot = NormalizeDouble(0.01+MathMax(MathFloor((account_balance-30000)/100),0)*0.01,2);//lot = MathMin(lot, SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX));return(lot);
};//---------------------------------------------------------------------------+
Если сам написал, то за 2 минуты поймёшь в чём дело!
Дааа... Извините, конечно, но кажется здесь на форуме массовый психоз - "в любом случае объясните Integer'у, что он не прав". Прям чемпионат мира какой-то.
Integer: Дааа... Извините, конечно, но кажется здесь на форуме массовый психоз - "в любом случае объясните Integer'у, что он не прав". Прям чемпионат мира какой-то.
- Доктор, по мне бегают маленькие крокодильчики!
- Пациент, что Вы себе позволяете?! Не надо их на меня перекидывать!
А в классе - куча мусора, который съедает время.
И перекомпилить придётся в обоих случаях.
Чем проще код - тем лучше!
Последний раз, когда писал здесь что-то про повышение быстродействия, мне ответили, что незачем себя лишать удобства, т.е. опять я был не прав.
С чем связана такая особая потребность в повышении быстродействия? Не так часто вызывается функция открытия позиции, чтобы это как-то заметно повлияло на тестирование. Если повышение скорости открытия в реале... не знаю на что могут повлиять пол миллисекунды. Очень интересно на что? Если так сражаться за быстродействие, стоит отказаться и от функций, для каждого случая писать включаемые файлы. (Но и на этот тезис мне сечас конечно возразят, что мол компилятор все оптимизирует).
В одном случая придется только перекомпилировать, а в другом делать исправление, но сначала разобраться, в чем же дело. Такая вот небольшая разница.
Проще, чем три строчки: подключить, объявить, вызывать.
Исправте:
на
Исправил - но результат тот же.
Позиции отказываются докупаться.
(но стопы и тейк профиты выставляются правильно.)
Mike_Kharkov!
Чтобы помочь вам, нужно следующее:
1. Лаконично и точно написать что вы хотите.
2. Приложить не кусок, а смысловую часть кода.
3. Вы денежку проверяете?
Последний раз, когда писал здесь что-то про повышение быстродействия, мне ответили, что незачем себя лишать удобства, т.е. опять я был не прав.
С чем связана такая особая потребность в повышении быстродействия? Не так часто вызывается функция открытия позиции, чтобы это как-то заметно повлияло на тестирование. Если повышение скорости открытия в реале... не знаю на что могут повлиять пол миллисекунды. Очень интересно на что? Если так сражаться за быстродействие, стоит отказаться и от функций, для каждого случая писать включаемые файлы. (Но и на этот тезис мне сечас конечно возразят, что мол компилятор все оптимизирует).
В одном случая придется только перекомпилировать, а в другом делать исправление, но сначала разобраться, в чем же дело. Такая вот небольшая разница.
Проще, чем три строчки: подключить, объявить, вызывать.
Вы правильно заметили: "MQ что-то изменили"...
Если сам написал, то за 2 минуты поймёшь в чём дело!
Mike_Kharkov!
Чтобы помочь вам, нужно следующее:
1. Лаконично и точно написать что вы хотите.
2. Приложить не кусок, а смысловую часть кода.
3. Вы денежку проверяете?
2) Прикладываю весь код + оранжевым пометил то, что считаю смысловым.
3) Тоже пометил оранжевым. (рядом с остальным.)
Тёзка, вообще все не правильно делаешь!
Дай скайп в личку, здесь долго объяснять
Вы правильно заметили: "MQ что-то изменили"...
Если сам написал, то за 2 минуты поймёшь в чём дело!
Дааа... Извините, конечно, но кажется здесь на форуме массовый психоз - "в любом случае объясните Integer'у, что он не прав". Прям чемпионат мира какой-то.
- Доктор, по мне бегают маленькие крокодильчики!
- Пациент, что Вы себе позволяете?! Не надо их на меня перекидывать!
- Доктор, по мне бегают маленькие крокодильчики!
- Пациент, что Вы себе позволяете?! Не надо их на меня перекидывать!