[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 192
Isto é o que eu recebo quando a EA trabalha no testador:
2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1: aberto #1 limite de venda 2.00 EURUSD a 1.27972 ok 2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1: Alerta: Expiração do pedido = 2012.01.11:12:00 2013.03.01 12:45:58 2012.01.12 16:29 Testador: pedido nº 1, venda 2,00 EURUSD é aberto em 1.27972
Ou seja, data e hora de expiração são definidas corretamente, como eu quero, mas não há nenhum fechamento no momento da expiração - uma posição é aberta após 24 horas.
Procurei em alguns fóruns e o problema ocorre. As respostas habituais são "funciona para mim" ou "rastreie você mesmo as ordens pendentes". Eu mesmo não quero rastreá-los e isso não está funcionando para mim.
borilunad: Sergey! estou deixando a pergunta sobre a função em aberto por enquanto, pois amanhã vou inserir mais algumas funções em seu teste EA para conduzir uma experiência limpa. Eu o observei em modo visual e quase todos os fechamentos duplos são os últimos, os anteriores são fechados por SL e TP, ou seja, não há nada por onde escolher. Eu removi as Paradas e Takes a fim de ter algo para escolher. Amanhã vou mostrar ao seu consultor especializado todas as funções e comentários adicionais! Você poderá ver por si mesmo como a função funciona. Eu realmente quero que isso mostre que eu estava errado! Se eu estiver certo, vou tentar fazer o meu melhor! Vejo vocês amanhã!
Sergey, Dubakin Fiz uma verificação visual e me assegurei de que esta função selecionava os máximos, que era o que eu precisava! Estou feliz por não ter mais dúvidas, e minhas desculpas a vocês! Mas em nosso negócio "é melhor medir sete vezes"... Mostrando seu testador EA para verificação de funções, com recursos e comentários adicionados para uma verificação visual mais clara! Obrigado!
externint EA_Magic=135; // внешняя переменнаяint TimeNow, TimePrev, PrevType; // глобальные переменныеint start()
{
double Price,SL,TP;
int Ticket;
TimeNow=iTime(NULL,240,0);
if(TimePrev==TimeNow) return(0);
if(PrevType!=1) {
Price=NormalizeDouble(Ask,Digits);
// SL=NormalizeDouble(Price-300*Point,Digits); // TP=NormalizeDouble(Price+300*Point,Digits);
Ticket=OrderSend(Symbol(),OP_BUY,0.1,Price,3,0,0,"",EA_Magic);
if(Ticket!=-1) { TimePrev=TimeNow; PrevType=1; } }
elseif(PrevType!=-1) {
Price=NormalizeDouble(Bid,Digits);
// SL=NormalizeDouble(Price+300*Point,Digits); // TP=NormalizeDouble(Price-300*Point,Digits);
Ticket=OrderSend(Symbol(),OP_SELL,0.1,Price,3,0,0,"",EA_Magic);
if(Ticket!=-1) { TimePrev=TimeNow; PrevType=-1; } }
Comment("BuyPos: ",NumberOfBuyPositions(),"; SellPos: ",NumberOfSellPositions(),
"; LotPos: ",GetAmountLotFromOpenPos(),
"\nMaxLoss: ",DoubleToStr(GetMinProfit(),2),"; MaxProf: ",DoubleToStr(GetMaxProfit(),2),
"\nLossDiff: ",DoubleToStr(GetMinProfit()+GetMaxProfit(),2));
if(Hour()==0 && TimePrev==TimeNow) LockOFF(EA_Magic);
return(0);
}
bool LockOFF(int EA_Magic) {
double Result, PrevLoss, PrevProfit;
int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
bool Ans;
MaxProfitTicket=-1; MaxLossTicket=-1;
orders_total=OrdersTotal();
for(pos=orders_total-1; pos>=0; pos--) {
if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордерif(OrderType()>1) continue;
Result=OrderProfit()+OrderSwap()+OrderCommission();
if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType(); // end of for
} }
if(MaxLossTicket==-1) return(false); // нет убыточной позицииif(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY;
orders_total=OrdersTotal();
for(pos=orders_total-1; pos>=0; pos--) {
if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордерif(order_type!=OrderType()) continue;
Result=OrderProfit()+OrderSwap()+OrderCommission();
if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
PrevProfit=Result; MaxProfitTicket=OrderTicket(); // end of for
} }
if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции
Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
if(!Ans) {
Print("Ошибка при встречном закрытие!"); return(false);
}
return(true);
}
//+----------------------------------------------------------------------------+int NumberOfBuyPositions(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal(), kp=0;
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderType()==OP_BUY) {
if (op<0 || OrderType()==op) {
kp++;
} } } }
return(kp);
}
//+----------------------------------------------------------------------------+int NumberOfSellPositions(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal(), kp=0;
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
kp++;
} } } }
return(kp);
}
//+----------------------------------------------------------------------------+double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
double l=0;
int i, k=OrdersTotal();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
l+=OrderLots();
} } } }
return(l);
}
//+----------------------------------------------------------------------------+double GetMinProfit(string sy="", int op=-1, int mn=-1) {
double p;
int i, k=OrdersTotal();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (p>OrderProfit()+OrderCommission()+OrderSwap())
p=OrderProfit()+OrderCommission()+OrderSwap();
} } } }
return(p);
}
//+----------------------------------------------------------------------------+double GetMaxProfit(string sy="", int op=-1, int mn=-1) {
double p;
int i, k=OrdersTotal();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (p<OrderProfit()+OrderCommission()+OrderSwap())
p=OrderProfit()+OrderCommission()+OrderSwap();
} } } }
return(p);
}
//+----------------------------------------------------------------------------+
Sergey, Dubakin Fiz uma verificação visual e me assegurei de que esta função selecionava os máximos, que era o que eu precisava! Estou feliz por não ter mais dúvidas, e minhas desculpas a vocês! Mas em nosso negócio "é melhor medir sete vezes"... Mostrando seu testador EA para verificação de funções, com recursos e comentários adicionados para uma verificação visual mais clara! Obrigado!
Como assim... Baseado em Igor Kim fez algo... Apenas uma de suas características... o resto é o mesmo...
//+----------------------------------------------------------------------------+int NumberOfBuyPositions(string sy="", int op=-1, int mn=-1) { // для чего присвоены значения по-умолчанию, если они нигде не используются? Кроме op (и то неверно)
int i, k=OrdersTotal(), kp=0;
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderType()==OP_BUY) { // тут жесткая проверка на тип Buy
if (op<0 || OrderType()==op) { // тут лишняя проверка на значение op, используемое по умолчанию и ещё одна лишняя проверка на ==op
kp++;
} } } }
return(kp);
}
//+----------------------------------------------------------------------------+
algo assim, acho eu:
//+----------------------------------------------------------------------------+int NumberOfPositions(string sy, int op, int mn) {
int i, k=OrdersTotal()-1, kp=0;
for (i=k; i>=0; i--) {
if (OrderSelect(i,SELECT_BY_POS)) { // если ордер выбран
if (OrderMagicNumber()!=mn) continue; // если не наш магик - смотрим следующий ордер
if (OrderSymbol()!=sy) continue; // если не наш символ - смотрим следующий ордер
if (OrderType()!=op) continue; // если не соответствует тип - смотрим следующий
kp++; // тут искомый ордер - увеличим счётчик
}
}
return(kp);
}
//+----------------------------------------------------------------------------+
E chame-a para fora:
para contar Compra e Venda pelo símbolo atual, com Magic
//+----------------------------------------------------------------------------+int BuyPos= NumberOfPositions(Symbol(), OP_BUY, Magic);
int SellPos=NumberOfPositions(Symbol(), OP_SELL, Magic);
//+----------------------------------------------------------------------------+
A variável i tem um valor de 0 somente no início do loop. Além disso, acrescentará 1 valor a cada iteração.
Então há uma condição que fará com que o loop continue:
min>OrderLots()
Mas o min é declarado como zero e seu valor não muda em nenhum outro lugar no código. O que significa que este valor nunca será verdadeiro! Onde está a lógica?
Estive navegando no fio. Sua lógica é estranha. Estou interessado na última linha de código:
A variável i tem um valor de 0 somente no início do laço. Além disso, acrescentará valor a cada iteração em 1.
Então, há uma condição para que o ciclo continue:
Mas o min é declarado como zero, e seu valor nunca muda em nenhum outro lugar no código. O que significa que este valor nunca será verdadeiro! Onde está a lógica?
int i, ot = OrdersTotal();
double min=0.0;
int min_ticket=0;
for(i=0;i<ot;i++)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
if(min==0.0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();}
}
Se o fizermos desta maneira, todas as coisas estranhas devem desaparecer.
Eu olhei através do ramo. Sua lógica é estranha. Estou interessado na última linha de código:
A variável i tem valor 0 somente no início do laço. Além disso, acrescentará valor a cada iteração em 1.
Então, há uma condição para que o ciclo continue:
Mas o min é declarado como zero, e seu valor nunca muda em nenhum outro lugar no código. O que significa que este valor nunca será verdadeiro! Onde está a lógica?
Igor Kim tem um conselheiro que faz o seguinte em um intervalo definido
Obrigado!
Olá.
Problema com as ordens pendentes, especificamente a data de expiração.
É assim que uma nova ordem é aberta, ou seja, se não tiver sido acionada em uma hora, o servidor deve fechá-la.
Em seguida, eu verifico qual é a data de validade:
Isto é o que eu recebo quando a EA trabalha no testador:
2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1: aberto #1 limite de venda 2.00 EURUSD a 1.27972 ok
2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1: Alerta: Expiração do pedido = 2012.01.11:12:00
2013.03.01 12:45:58 2012.01.12 16:29 Testador: pedido nº 1, venda 2,00 EURUSD é aberto em 1.27972
Ou seja, data e hora de expiração são definidas corretamente, como eu quero, mas não há nenhum fechamento no momento da expiração - uma posição é aberta após 24 horas.
Procurei em alguns fóruns e o problema ocorre. As respostas habituais são "funciona para mim" ou "rastreie você mesmo as ordens pendentes". Eu mesmo não quero rastreá-los e isso não está funcionando para mim.
Igor Kim tem um conselheiro que faz o seguinte em um intervalo definido
Funciona muito bem.
Obrigado pela dica!
Funciona muito bem.
Obrigado pela dica!
Não sou eu, é o Google.
Acho que você mesmo pode puxar a função salvar tela dali e definir seus próprios parâmetros para chamá-la - eu era muito preguiçoso...
Sergey! estou deixando a pergunta sobre a função em aberto por enquanto, pois amanhã vou inserir mais algumas funções em seu teste EA para conduzir uma experiência limpa. Eu o observei em modo visual e quase todos os fechamentos duplos são os últimos, os anteriores são fechados por SL e TP, ou seja, não há nada por onde escolher. Eu removi as Paradas e Takes a fim de ter algo para escolher. Amanhã vou mostrar ao seu consultor especializado todas as funções e comentários adicionais! Você poderá ver por si mesmo como a função funciona. Eu realmente quero que isso mostre que eu estava errado! Se eu estiver certo, vou tentar fazer o meu melhor! Vejo vocês amanhã!
Sergey, Dubakin Fiz uma verificação visual e me assegurei de que esta função selecionava os máximos, que era o que eu precisava! Estou feliz por não ter mais dúvidas, e minhas desculpas a vocês! Mas em nosso negócio "é melhor medir sete vezes"... Mostrando seu testador EA para verificação de funções, com recursos e comentários adicionados para uma verificação visual mais clara! Obrigado!
Sergey, Dubakin Fiz uma verificação visual e me assegurei de que esta função selecionava os máximos, que era o que eu precisava! Estou feliz por não ter mais dúvidas, e minhas desculpas a vocês! Mas em nosso negócio "é melhor medir sete vezes"... Mostrando seu testador EA para verificação de funções, com recursos e comentários adicionados para uma verificação visual mais clara! Obrigado!
Como assim... Baseado em Igor Kim fez algo... Apenas uma de suas características... o resto é o mesmo...
algo assim, acho eu:
E chame-a para fora:
para contar Compra e Venda pelo símbolo atual, com Magic
Você pode me dizer como escolher o menor lote entre todos os comércios abertos?
double min=0;
int min_ticket=0;
for(i=0;i<ot;i++)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderType()!=OP_BUY && OrderType()!=OP_SELLL) continue;
if(i==0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();}
}
A variável i tem um valor de 0 somente no início do loop. Além disso, acrescentará 1 valor a cada iteração.Estive navegando no fio. Sua lógica é estranha. Estou interessado na última linha de código:
Então há uma condição que fará com que o loop continue:
Mas o min é declarado como zero e seu valor não muda em nenhum outro lugar no código. O que significa que este valor nunca será verdadeiro! Onde está a lógica?
A variável i tem um valor de 0 somente no início do laço. Além disso, acrescentará valor a cada iteração em 1.Estive navegando no fio. Sua lógica é estranha. Estou interessado na última linha de código:
Então, há uma condição para que o ciclo continue:
Mas o min é declarado como zero, e seu valor nunca muda em nenhum outro lugar no código. O que significa que este valor nunca será verdadeiro! Onde está a lógica?
A variável i tem valor 0 somente no início do laço. Além disso, acrescentará valor a cada iteração em 1.Eu olhei através do ramo. Sua lógica é estranha. Estou interessado na última linha de código:
Então, há uma condição para que o ciclo continue:
Mas o min é declarado como zero, e seu valor nunca muda em nenhum outro lugar no código. O que significa que este valor nunca será verdadeiro! Onde está a lógica?Por favor, note que
Se min>OrderLots(), então min = OrderLots();
Por favor, note que
Se min>OrderLots() então, min = OrderLots();