Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 110
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Помогите дописать функцию, которая будет подсчитывать количество ордеров и их суммарный профит закрытых за последние 60 секунд на текущей паре. На языке вертится не могу правильно сформулировать.
double ClosingSellProfit=0, ClosingBuyProfit;
for(int i=0; i<OrdersHistoryTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol())
{
}
}
Думаю разберётесь:
double GetProfitOldClosePos(string symb="", int type=-1, int mg=-1) {
if(symb=="0") symb=Symbol();
datetime gt=0,ct=0;
double pr=0;
for(int i=OrdersHistoryTotal()-1; i>=0; i--) {
if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if(OrderSymbol()==symb &&(type<0||OrderType()==type)&& OrderMagicNumber()==mg) {
ct=OrderCloseTime();
// 120 секунд разницы между закрытием первой и последней в сетке
if((gt<=ct && ct<=gt+120) || gt==0) {
gt=ct;
pr+=OrderProfit()+OrderCommission()+OrderSwap();
}}}}
return(pr);
}
Помогите дописать функцию, которая будет подсчитывать количество ордеров и их суммарный профит закрытых за последние 60 секунд на текущей паре. На языке вертится не могу правильно сформулировать.
double ClosingSellProfit=0, ClosingBuyProfit;
for(int i=0; i<OrdersHistoryTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol())
{
if(OrderType()==OP_SELL)
{
if(. . .)
{
CountClosedSellOrders++;
ClosingSellProfit+=OrderProfit()+OrderCommission()+OrderSwap();
}
if(OrderType()==OP_BUY)
{
if(. . .)
{
CountClosedBuyOrders++;
ClosingBuyProfit+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
double ClosingSellProfit=0,ClosingBuyProfit;
//for(int i=0; i<OrdersHistoryTotal(); i++)
for(int i=OrdersHistoryTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol())
{
if(OrderCloseTime()>=TimeCurrent()-60)
{
if(OrderType()==OP_SELL)
{
CountClosedSellOrders++;
ClosingSellProfit+=OrderProfit()+OrderCommission()+OrderSwap();
}
if(OrderType()==OP_BUY)
{
CountClosedBuyOrders++;
ClosingBuyProfit+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
Как указать трейлинг стоп при открытии ордера?
если цена равна нулю или не задана то назначим координатой линии цену последнего ордера. С этим все норм
Журнал тоже норм, сливает счет как и нужно. Ошибки про нехватку депозита я не смотрю.
А линия все равно красная. Т.е мы вызываем линию бай, она так и есть, передаем параметры, но передаются другие.
Это условие уж точно не следует писать как у вас в коде. Сами себе трудности создаёте, чтобы "героически" их преодолевать )))
Всё, что создаёт красную линию в коде закомментировано, следовательно, её создаёт кое-кто другой. Или она висит на графике с тех пор, когда та часть кода была в работе.
Рекомендую всё то же, что и много раз рекомендовал и раньше - принтовать все действия и коды возврата (ошибок) в журнал, это даст ответы на многие вопросы.
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
Но основной принцип для большинства индикаторов таков:
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
if(rates_total<1) return(0); // проверка достаточности данных для расчёта индикатора, если не достаточно - выходим
// если для расчёта требуются некое количество баров слева от индекса цикла, ...
// ... то проверять нужно это количество, а не 1
//--- Действия для полного перерасчёта индикатора
int limit=rates_total-prev_calculated; // количество посчитанных уже баров
if(limit>1) { // если количество больше 1, значит имеем новые данные, и нужно полностью пересчитать индикатор
limit=rates_total-1; // задаём количество требуемых для расчёта баров равным количеству баров в истории,
// если для расчёта требуются некое количество баров слева от индекса цикла, ...
// ... то это количество тоже нужно вычесть из rates_total чтобы не выйти за пределы массива
// так же тут нужно при необходимости произвести инициализацию буферов индикатора
}
//--- Основной цикл индикатора
for(int i=limit; i>=0; i--) {
// тут выполняем нужные расчёты и записываем их результат в нужные буферы, например:
ExtMapBuffer[i]=(open[i]+high[i]+low[i]+close[i])/4.0; // Выведем на график среднюю цену каждой свечи (OHLC/4.0)
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
Это условие уж точно не следует писать как у вас в коде. Сами себе трудности создаёте, чтобы "героически" их преодолевать )))
Всё, что создаёт красную линию в коде закомментировано, следовательно, её создаёт кое-кто другой. Или она висит на графике с тех пор, когда та часть кода была в работе.
Рекомендую всё то же, что и много раз рекомендовал и раньше - принтовать все действия и коды возврата (ошибок) в журнал, это даст ответы на многие вопросы.
мистика в 200 строк
:)
Шаблон у вас не полный - вы скорее всего не задали в мастере буферы индикатора, в которые будут записываться посчитанные данные.
Но основной принцип для большинства индикаторов таков:
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
if(rates_total<1) return(0); // проверка достаточности данных для расчёта индикатора, если не достаточно - выходим
// если для расчёта требуются некое количество баров слева от индекса цикла, ...
// ... то проверять нужно это количество, а не 1
//--- Действия для полного перерасчёта индикатора
int limit=rates_total-prev_calculated; // количество посчитанных уже баров
if(limit>1) { // если количество больше 1, значит имеем новые данные, и нужно полностью пересчитать индикатор
limit=rates_total-1; // задаём количество требуемых для расчёта баров равным количеству баров в истории,
// если для расчёта требуются некое количество баров слева от индекса цикла, ...
// ... то это количество тоже нужно вычесть из rates_total чтобы не выйти за пределы массива
// так же тут нужно при необходимости произвести инициализацию буферов индикатора
}
//--- Основной цикл индикатора
for(int i=limit; i>=0; i--) {
// тут выполняем нужные расчёты и записываем их результат в нужные буферы, например:
ExtMapBuffer[i]=(open[i]+high[i]+low[i]+close[i])/4.0; // Выведем на график среднюю цену каждой свечи (OHLC/4.0)
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
Прошу помощи!
Есть строка ABCDEF как разделить её на 3 строки (сохранить в переменную string):
AB
CD
EF
Прошу помощи!
Есть строка ABCDEF как разделить её на 3 строки (сохранить в переменную string):
AB
CD
EF
string string_value, // строка
int start_pos, // с какой позиции начать
int length=0 // длина извлекаемой строки
);