Características úteis da KimIV - página 98

 
Olá Igor! 09.05.2008 17:10 na página 17. 17 Você descreveu a função de correlação. Você poderia descrever a função de correlação usando a fórmula de Pearson
 

Olá Igor!

Você poderia mudar o e-OpenByTime EA ou escrever um novo, ou sugerir um pronto :))))

Eu preciso de uma EA que coloque as pausas em diferentes direções no tempo X por N pontos do preço!

 

Olá, Igor!

Você tem um roteiro que desenha segmentos de linha horizontais em X e Y pips a partir do sinal?

Deixe-me explicar: há sinais de compra/venda (cruzamento de muwings, fractal, etc.).

O roteiro estabelece 4 parâmetros, por exemplo:

- 300 pips para parar,

- 500 pips para levar,

- 10 barras = comprimento das barras,

- onde e como levar os sinais - referência ao indicador de sinal, inserção de condições para os sinais... Este ponto é algo a ser pensado!

O roteiro desenha 2 linhas em cada sinal de compra:

1) a primeira ("stop") mais baixa em 300 pips do preço de abertura da barra de sinal;

2) segundo ("Take") maior em 500 pontos a partir do preço de abertura da barra de sinal

3) as linhas começam na barra de sinal e terminam na décima barra.

É o mesmo no caso dos sinais de Venda, apenas os travessões das linhas são invertidos.

Acho que tal visualização será útil para uma estimativa preliminar do "signal-stop".

Cumprimentos, Vadim.

 

Olá Igor!

Pergunta 1.

Há um erro 138 em sua função OpenPosition() - ERR_REQUOTE é pausado:

se (err!=135) Dormir(1000*7,7);

Embora seja recomendado na documentação atualizar os dados e tentar novamente de imediato (o preço sai, quero abrir uma posição o mais rápido possível)))

Que esteja correto, então:

if (err!=135 && err!=138) Sleep(1000*7,7);?

Ou talvez esteja me faltando algo?

Pergunta 2.

Favor informar como especificar corretamente o parâmetro Slippage igual a 5 pontos na função OrderSend() se minha corretora (Alpari) der 5 casas decimais.

- "50"?

- ou "5"?

 
slavamir писал(а) >>

Pergunta 1.

Em sua função OpenPosition() erro 138 - ERR_REQUOTE é pausado:

se (err!=135) Dormir(1000*7,7);

Embora seja recomendado na documentação atualizar os dados e tentar novamente de imediato (o preço sai, quero abrir uma posição o mais rápido possível)))

Que esteja correto, então:

if (err!=135 && err!=138) Sleep(1000*7,7);?

Sim, está tudo bem! Você pode fazer isso também... Obrigado!

slavamir escreveu >>

Pergunta 2.

Por favor, diga-me como definir corretamente o parâmetro Slippage igual a 5 pontos na função OrderSend() se minha corretora (Alpari) der 5 casas decimais.

- "50"?

- Ou é "5"?

5
 

Olá Igor,

você poderia por favor ajudar a refinar sua função GetProfitFromDateInCurrency(). Preciso dele para calcular o lucro até mesmo de pedidos fechados apenas. Uso o fechamento parcial (splitting) de pedidos e a função CloseBy para fechar o saldo de um pedido existente. Para determinar se um número par ou ímpar de pedidos foi fechado, uso a fórmula:

double x, y; --------- Suponha
x=MathFloor(OrderLots()/0.02); a. Se lotes 0.04/0.02=2 --- b. Se lotes 0.03/0.02=1
y=x*0.02; a. 2*0,02=0,04 --- б. 1*0,02=0,02
if (y===OrderLots()) ---------- а. 0,04==0,04 --- b. 0,02!=0,04
XLots=y; Se igual, então XLots recebe o valor de y

Isto funciona (não consegui pensar em uma maneira melhor de dividir em pares/equites e não recebi uma dica quando perguntei).

Em seguida, a chamada de função real (a que eu fiz da sua)
ClOrdProf=GetProfitFromDateInCurrency("", -1, -1, XTime, XLots);

E minha vã tentativa de adicionar à sua função a condição de que o lucro deve ser calculado se os lotes estiverem iguais:

double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0, double lt=-1)
{
double p=0;
int i, k=OrdersHistoryTotal();

if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if ((OrderSymbol()==sy ||| sy===") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELLL) {
if (mn<0 || OrderMagicNumber()==mn) {
if (dt<OrderCloseTime()) {
if (OrderLots()==lt) {
p+=OrderProfit()+OrderComission()+OrderSwap();
}
}
}
}
}
}
} }
return(p);
}

Não quer contar.
1. Estou errado em algum lugar da função?
2. O fato de os pedidos serem fechados pela OrdCloseBy poderia ter algum efeito?

 
vamos assumir que o parâmetro int lt toma três valores de bandeira
-1 todas as ordens, 0 - lotes pares, 1 - lotes ímpares, então
substitui
if (OrderLots()==lt) {
p+=OrderProfit()+OrderComission()+OrderSwap()

}

a

if (lt == -1){
p+=OrderProfit
()+OrderComission()+OrderSwap();
} else {
int test = OrderLors() * 100;
if (lt == test % 2) {
p+=OrderProfit()+OrderComission()+OrderSwap();
} else {
p+=OrderProfit()+OrderComission()+OrderSwap();
}
}
 
keekkenen писал(а) >>
Digamos que na função GetProfitFromDateInCurrency() o parâmetro int lt leva três valores de bandeira


Obrigado, seu método de cálculo de lote por modulo está correto, vou usá-lo mais tarde... Mas aqui é interessante, acontece que a função que eu refinei funciona... de certa forma. Adicionei Alerta para ver as mudanças de "p+=" e ele calcula tudo corretamente. Mas o valor ClOrdProf do qual vamos tirar informações não aparecerá: Alerta ("ClOrdProf= ",ClOrdProf);. No código, é o seguinte:
int start()
{
........................
bool
ClOrdProf=falso; //valor lógico
........................
ClOrdProf=GetProfitFromDateInCurrency(",-1,-1,XTime,XLots); //function call
se (ClOrdProf==verdadeiro)
Alerta ("ClOrdProf=",ClOrdProf); - não é atualizado no log
.........................
retorno; //saída do início()
}
// Função para calcular o lucro de pedidos fechados
double GetProfitFromDateInCurrency(string sy="", int op=-1, int mn=-1, datetime dt=0, double lt=-1)
{
duplo p=0;
int i, k=OrdersHistoryTotal();

se (sy=="0") sy=Símbolo();
para (i=0; i<k; i++) {
se (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
se ((OrderSymbol()==sy ||| sy==") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
se (mn<0 || OrderMagicNumber()==mn) {
se (dt<OrderCloseTime()) {
se (OrderLots()==lt) {
p+=OrderProfit()+OrderComission()+OrderSwap();
Alerta ("p= ", p); - atualizado em log
}
}
}
}
}
}
}
retorno(p);
}
Não consigo descobrir o que está errado...

 

Engraçado, não é, engraçado... engraçado para você e até para mim...(Vladimir Semyonovich)
Originalmente o ClOrdProf não é um bool, mas um duplo. E deveria haver "se (ClOrdProf>0 || ClOrdProf<0)" - a segunda parte, começando com "ou", para contar em caso de lucro negativo...o que eu chamo de "olho lavado" - eu mesmo não vi o que está na superfície imediatamente.
Graças a Keekkenen pela ajuda no cálculo de lotes pares/ímpares.
Graças ao Igor, pela possibilidade de atualizar sua função.

 
KimIV >>:

Функция TicketNearPos().

Эта функция возвращает тикет ближайшей к рынку позиции. В качестве критерия "близости" позиции выступает минимум расстояния в пунктах между ценой открытия позиции и текущей рыночной ценой. Отбор учитываемых позиций задаётся внешними параметрами:

  • sy - Наименование рыночного инструмента. Если задать этот параметр, то функция учтёт позиции только заданного инструмента. Значение по умолчанию - "" означает любой рыночный инструмент. Значение NULL означает текущий инструмент.
  • op - Торговая операция, тип позиции. Допустимые значения: OP_BUY, OP_SELL или -1. Значение по умолчанию -1 означает любую позицию.
  • mn - Идентификатор позиции, MagicNumber. Значение по умолчанию -1 означает любой идентификатор.
ЗЫ. Во вложении скрипт для тестирования функции TicketNearPos().
if (pp == 0) 
{return (ti);}
Notei um erro na função TypeNearPos quando a condição é atendida:
Preço de mercado = preço de ordem em aberto, então esta ordem não é mais levada em conta por esta função.
Eu tinha que acrescentar esta simples condição ao código.
Esta condição também ajudará nas funções similares TypeNearPos() e PriceOpenNearPos().