Помогите дописать функцию, которая будет подсчитывать количество ордеров и их суммарный профит закрытых за последние 60 секунд на текущей паре. На языке вертится не могу правильно сформулировать.
Помогите дописать функцию, которая будет подсчитывать количество ордеров и их суммарный профит закрытых за последние 60 секунд на текущей паре. На языке вертится не могу правильно сформулировать.
если цена равна нулю или не задана то назначим координатой линии цену последнего ордера. С этим все норм
Журнал тоже норм, сливает счет как и нужно. Ошибки про нехватку депозита я не смотрю.
А линия все равно красная. Т.е мы вызываем линию бай, она так и есть, передаем параметры, но передаются другие.
Это условие уж точно не следует писать как у вас в коде. Сами себе трудности создаёте, чтобы "героически" их преодолевать )))
Всё, что создаёт красную линию в коде закомментировано, следовательно, её создаёт кое-кто другой. Или она висит на графике с тех пор, когда та часть кода была в работе.
Рекомендую всё то же, что и много раз рекомендовал и раньше - принтовать все действия и коды возврата (ошибок) в журнал, это даст ответы на многие вопросы.
//--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
Шаблон у вас не полный - вы скорее всего не задали в мастере буферы индикатора, в которые будут записываться посчитанные данные.
Но основной принцип для большинства индикаторов таков:
//+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ intOnCalculate(constint rates_total, constint prev_calculated, constdatetime &time[], constdouble &open[], constdouble &high[], constdouble &low[], constdouble &close[], constlong &tick_volume[], constlong &volume[], constint &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); } //+------------------------------------------------------------------+
Это условие уж точно не следует писать как у вас в коде. Сами себе трудности создаёте, чтобы "героически" их преодолевать )))
Всё, что создаёт красную линию в коде закомментировано, следовательно, её создаёт кое-кто другой. Или она висит на графике с тех пор, когда та часть кода была в работе.
Рекомендую всё то же, что и много раз рекомендовал и раньше - принтовать все действия и коды возврата (ошибок) в журнал, это даст ответы на многие вопросы.
Artyom Trishkin: Шаблон у вас не полный - вы скорее всего не задали в мастере буферы индикатора, в которые будут записываться посчитанные данные.
Но основной принцип для большинства индикаторов таков:
//+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ intOnCalculate(constint rates_total, constint prev_calculated, constdatetime &time[], constdouble &open[], constdouble &high[], constdouble &low[], constdouble &close[], constlong &tick_volume[], constlong &volume[], constint &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); } //+------------------------------------------------------------------+
Помогите дописать функцию, которая будет подсчитывать количество ордеров и их суммарный профит закрытых за последние 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 // длина извлекаемой строки
);