Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 110
Você está perdendo oportunidades de negociação:
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Registro
Login
Você concorda com a política do site e com os termos de uso
Se você não tem uma conta, por favor registre-se
Por favor, ajude-me a escrever uma função que calculará o número de pedidos e seu lucro total fechado nos últimos 60 segundos sobre o par atual. Não consigo formulá-lo corretamente.
double ClosingSellProfit=0, ClosingBuyProfit;
for(int i=0; i<OrdersHistoryTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol())
{
}
}
Acho que talvez você entenda isso:
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);
}
Por favor, ajude-me a escrever uma função que calculará o número de pedidos e seu lucro total fechado nos últimos 60 segundos sobre o par atual. Não consigo encontrá-lo em minha língua, não consigo formulá-lo corretamente.
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();
}
}
}
}
Como posso especificar uma parada móvel ao abrir um pedido?
Se o preço for zero ou não estiver definido , defina a coordenada de linha para o preço do último pedido. Isto é bom.
O registro também é normal, ele drena a conta como deveria ser. Não vejo erros sobre o depósito insuficiente.
Mas a linha ainda está vermelha. Ou seja, chamamos a linha de compra, é assim, passamos os parâmetros, mas outros são passados.
Esta condição definitivamente não deve ser escrita como em seu código. Você cria suas próprias dificuldades para "heroicamente" superá-las ))))
Tudo o que cria a linha vermelha no código é comentado, por isso é criado por outra pessoa. Ou está pendurado no gráfico desde que essa parte do código estava em obras.
Recomendo o mesmo que já recomendei muitas vezes antes - imprimir todas as ações e devolver códigos (erros) ao registro, ele responderá muitas perguntas.
//| 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);
}
//+------------------------------------------------------------------+
Mas o princípio básico para a maioria dos indicadores é este:
//| 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);
}
//+------------------------------------------------------------------+
Esta condição certamente não deve ser escrita como em seu código. Você cria suas próprias dificuldades para "heroicamente" superá-las ))))
Tudo o que cria a linha vermelha no código é comentado, por isso é criado por outra pessoa. Ou está pendurado no gráfico desde que essa parte do código estava em obras.
Recomendo o mesmo que já recomendei muitas vezes antes - imprimir todas as ações e devolver códigos (erros) ao registro, isto responderá a muitas perguntas.
Mística de 200 linhas
:)
Você não tem um modelo completo - você provavelmente não definiu os buffers indicadores no assistente, onde os dados calculados serão escritos.
Mas o princípio básico para a maioria dos indicadores é este:
//| 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);
}
//+------------------------------------------------------------------+
Por favor, ajude!
Há uma cadeia ABCDEF como dividi-la em 3 cadeias (salvar em uma cadeia variável):
AB
CD
EF
Por favor, ajude!
Há uma cadeia ABCDEF como dividi-la em 3 cadeias (salvar em uma cadeia variável):
AB
CD
EF
string string_value, // строка
int start_pos, // с какой позиции начать
int length=0 // длина извлекаемой строки
);