Eu reescrevi esta função, adicionei um parâmetro fs, que permite escrever a primeira linha do arquivo, que é diferente de outras linhas, por exemplo, cabeçalho de tabela. A primeira linha será escrita no arquivo somente se duas condições forem cumpridas simultaneamente: o comprimento da linha é maior que zero e o tamanho do arquivo é zero. E a fim de manter a compatibilidade com a versão anterior, o novo parâmetro foi tornado opcional.
Parâmetros da função WritingLineInFile():
fn - nome do arquivo
st - o fio a ser escrito no arquivo
fs - primeira linha (cabeçalho da tabela)
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 28.04.2012 |//+----------------------------------------------------------------------------+//| Описание : Запись строки в файл |//| Параметры: |//| fn - имя файла |//| st - строка |//| fs - первая строка (шапка таблицы) |//+----------------------------------------------------------------------------+void WritingLineInFile(string fn, string st, string fs="") {
int fh=FileOpen(fn, FILE_READ|FILE_WRITE, " ");
if (fh>0) {
if (FileSize(fh)==0 && StringLen(fs)>0) FileWrite(fh, fs);
FileSeek (fh, 0, SEEK_END);
FileWrite(fh, st);
FileClose(fh);
}
}
ZZY. Em anexo está um roteiro para testar a função.
antes de mais nada, estou tentando entender as linhas:
intye=Year()-MathFloor(nq/4);
nq=MathMod(nq, 4);
Por padrão nq = 0, portanto não está claro o que obtemos da expressão MathMod(nq/4), pois o resultado será sempre 0. Também a segunda linha não está clara, pois 0/4 não tem resto, favor esclarecer.
Obrigada, Natasha, por sua pergunta. Graças a você, eu verifiquei novamente a função e encontrei o erro. Na linha
int ye=Year()-MathFloor(nq/4);
Preciso substituir o sinal de menos por um sinal de mais.
int ye=Year()+MathFloor(nq/4);
E agora a substância de sua pergunta. nq nem sempre é igual a zero. Pode haver quaisquer valores inteiros, incluindo os negativos. Estas linhas funcionam quando nq é um múltiplo de 4, ou seja, quando você precisa adicionar ou subtrair 4 trimestres (ano).
Obrigada, Natasha, por sua pergunta. Graças a você, eu verifiquei novamente a função e encontrei o erro. Na linha
Preciso substituir o sinal de menos por um sinal de mais.
E agora a substância de sua pergunta. nq nem sempre é igual a zero. Pode haver quaisquer valores inteiros, incluindo os negativos. As linhas que você especificou trabalham nos casos em que nq é um múltiplo de 4, ou seja, quando você precisa adicionar ou subtrair 4 trimestres (ano).
Obrigado por sua resposta, Igor.... demorei mais do que o normal para lidar com a função, mas ainda assim descobri))))))) na mesma função, me parece que não preciso diminuir o ano na expressão:
na mesma função, acho que não é preciso reduzir o ano na expressão.
Justifique, Natasha, por que não? Pelo contrário, parece-me lógico diminuir o ano após fechar o círculo mensal na direção oposta. Em sua expressão, tornar o ano menor é o mesmo que mover o ponteiro das horas de volta uma hora após o ponteiro dos minutos ter sido enrolado em um círculo completo. Dê-nos sua versão da função e nós a discutiremos... Talvez sua versão tenha mais sucesso do que a minha.
Bem, eu terminei os testes completos desta função. Levei em conta a dispersão quando necessário, tentei otimizá-la. A função retorna o máximo de drawdown das posições atualmente abertas em pips. Tradicionalmente, você pode passar parâmetros para a função e assim filtrar as posições que você precisa para análise:
sy - Nome do instrumento. Se este parâmetro for passado, a função verificará apenas as posições do instrumento especificado. NULL significa o instrumento atual, e "" (por padrão) significa qualquer instrumento.
op - Operação comercial, tipo de posição. Valores válidos: OP_BUY, OP_SELL ou -1. O valor padrão -1 significa qualquer posição.
mn - Identificador de posição (MagicNumber). O valor padrão de -1 significa qualquer MagicNumber.
tf - Quadro de tempo, no qual são mostrados os valores das barras Alta e Baixa. O valor padrão é 0 - o período de tempo atual.
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 01.05.2012 |//| Описание : Возвращает максимальную просадку в пунктах текущих открытых |//| позиций. |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//| tf - таймфрейм ( 0 - текущий таймфрейм) |//+----------------------------------------------------------------------------+int GetDrawdownOpenPosInPoint(string sy="", int op=-1, int mn=-1, int tf=0) {
if (sy=="0") sy=Symbol();
if (tf==0) tf=Period();
datetime to=TimeOpenFirstPos(sy, op, mn); // Время открытия первой позицииdatetime tb=GetTimeOpenBar(sy, tf, to);
int dd, md=0; // Просадкаdouble po, sp; // Пункт, спрэдint i, k=OrdersTotal(); // Номера позицийint nb; // Номер бараif (tb>0) {
while (tb<TimeCurrent()) {
dd=0;
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (mn<0 || OrderMagicNumber()==mn)) {
if ((op<0 || OrderType()==op) && (OrderType()==OP_BUY || OrderType()==OP_SELL)) {
if (tb>OrderOpenTime()) {
nb=iBarShift(OrderSymbol(), tf, tb, True);
if (nb>=0) {
po=MarketInfo(OrderSymbol(), MODE_POINT);
if (po==0) Message("В обзоре рынка отсутствует символ "+OrderSymbol()+". Точность расчётов не гарантируется!");
else {
if (OrderType()==OP_BUY) {
dd+=(OrderOpenPrice()-iLow(OrderSymbol(), tf, nb)+po)/po;
}
if (OrderType()==OP_SELL) {
sp=po*MarketInfo(OrderSymbol(), MODE_SPREAD);
dd+=(iHigh(OrderSymbol(), tf, nb)-OrderOpenPrice()+sp)/po;
}
}
}
}
}
}
}
}
if (md<dd) md=dd;
tb+=60*tf;
}
}
return(md);
}
SZZ. Em anexo está um roteiro para testar a função GetDrawdownOpenPosInPoint().
KimIV: Justifique, Natasha, por que não? Pelo contrário, parece-me lógico diminuir o ano após fechar o círculo mensal na direção oposta. Reduzir o ano na expressão que você acabou de mencionar é o mesmo que mover o ponteiro das horas para trás uma hora após o ponteiro dos minutos ter sido enrolado um círculo completo. Dê-nos sua versão da função e nós a discutiremos... Talvez sua versão tenha mais sucesso do que a minha.
Eu raciocinei assim: digamos que precisamos determinar o início do Q7 no passado e no futuro, depois nq= -7 e nq=7 respectivamente. Mathfloor retornará -2 para o passado e +1 para o futuro (a julgar pela descrição da função na documentação), portanto para a situação no passado subtrairemos mais um ano do que adicionamos no futuro..... se continuarmos os cálculos para o passado, teremos que reduzir o ano novamente e terminaremos em 2009.....
Infelizmente devido à falta de tempo (quase não tenho tempo para ler a página do site), não posso fornecer o código que acho correto, mas acho que, se necessário, não será difícil corrigi-lo.
Eu raciocinei assim: digamos que precisamos determinar o início do Q7 no passado e no futuro, depois nq= -7 e nq=7 respectivamente. Mathfloor retornará -2 para o passado e +1 para o futuro (a julgar pela descrição da função na documentação), portanto para a situação no passado subtrairemos mais um ano do que adicionamos no futuro..... se continuarmos os cálculos para o passado teremos que reduzir o ano novamente e terminaremos em 2009...
Eu concordo com seu raciocínio, mas você está esquecendo os tipos de dados envolvidos nas operações. O MathFloor() pode ser omitido completamente. Veja o resultado do roteiro no anexo.
Boa tarde, Igor)))) Para ser honesto, eu não entendi bem sua resposta, e até o roteiro anexo não trouxe clareza, mas sim o oposto... )))) mas acho que vou descobrir a tempo)))) Poderia me dizer por que há vantagens na linha de retorno(StrToTime(ye+"."+mo+".01").
Função WritingLineInFile().
Eu reescrevi esta função, adicionei um parâmetro fs, que permite escrever a primeira linha do arquivo, que é diferente de outras linhas, por exemplo, cabeçalho de tabela. A primeira linha será escrita no arquivo somente se duas condições forem cumpridas simultaneamente: o comprimento da linha é maior que zero e o tamanho do arquivo é zero. E a fim de manter a compatibilidade com a versão anterior, o novo parâmetro foi tornado opcional.
Parâmetros da função WritingLineInFile():
ZZY. Em anexo está um roteiro para testar a função.
DateBeginQuarterantes de mais nada, estou tentando entender as linhas:
Por padrão nq = 0, portanto não está claro o que obtemos da expressão MathMod(nq/4), pois o resultado será sempre 0. Também a segunda linha não está clara, pois 0/4 não tem resto, favor esclarecer.
Obrigada, Natasha, por sua pergunta. Graças a você, eu verifiquei novamente a função e encontrei o erro. Na linha
Preciso substituir o sinal de menos por um sinal de mais.
E agora a substância de sua pergunta. nq nem sempre é igual a zero. Pode haver quaisquer valores inteiros, incluindo os negativos. Estas linhas funcionam quando nq é um múltiplo de 4, ou seja, quando você precisa adicionar ou subtrair 4 trimestres (ano).
Obrigada, Natasha, por sua pergunta. Graças a você, eu verifiquei novamente a função e encontrei o erro. Na linha
Preciso substituir o sinal de menos por um sinal de mais.
E agora a substância de sua pergunta. nq nem sempre é igual a zero. Pode haver quaisquer valores inteiros, incluindo os negativos. As linhas que você especificou trabalham nos casos em que nq é um múltiplo de 4, ou seja, quando você precisa adicionar ou subtrair 4 trimestres (ano).
Obrigado por sua resposta, Igor.... demorei mais do que o normal para lidar com a função, mas ainda assim descobri))))))) na mesma função, me parece que não preciso diminuir o ano na expressão:
então será correto.
na mesma função, acho que não é preciso reduzir o ano na expressão.
Função GetDrawdownOpenPosInPoint()
Bem, eu terminei os testes completos desta função. Levei em conta a dispersão quando necessário, tentei otimizá-la. A função retorna o máximo de drawdown das posições atualmente abertas em pips. Tradicionalmente, você pode passar parâmetros para a função e assim filtrar as posições que você precisa para análise:
SZZ. Em anexo está um roteiro para testar a função GetDrawdownOpenPosInPoint().
Justifique, Natasha, por que não? Pelo contrário, parece-me lógico diminuir o ano após fechar o círculo mensal na direção oposta. Reduzir o ano na expressão que você acabou de mencionar é o mesmo que mover o ponteiro das horas para trás uma hora após o ponteiro dos minutos ter sido enrolado um círculo completo. Dê-nos sua versão da função e nós a discutiremos... Talvez sua versão tenha mais sucesso do que a minha.
Eu raciocinei assim: digamos que precisamos determinar o início do Q7 no passado e no futuro, depois nq= -7 e nq=7 respectivamente. Mathfloor retornará -2 para o passado e +1 para o futuro (a julgar pela descrição da função na documentação), portanto para a situação no passado subtrairemos mais um ano do que adicionamos no futuro..... se continuarmos os cálculos para o passado, teremos que reduzir o ano novamente e terminaremos em 2009.....
Infelizmente devido à falta de tempo (quase não tenho tempo para ler a página do site), não posso fornecer o código que acho correto, mas acho que, se necessário, não será difícil corrigi-lo.
Eu raciocinei assim: digamos que precisamos determinar o início do Q7 no passado e no futuro, depois nq= -7 e nq=7 respectivamente. Mathfloor retornará -2 para o passado e +1 para o futuro (a julgar pela descrição da função na documentação), portanto para a situação no passado subtrairemos mais um ano do que adicionamos no futuro..... se continuarmos os cálculos para o passado teremos que reduzir o ano novamente e terminaremos em 2009...
Eu concordo com seu raciocínio, mas você está esquecendo os tipos de dados envolvidos nas operações. O MathFloor() pode ser omitido completamente. Veja o resultado do roteiro no anexo.