Mas para responder à sua pergunta: é possível fechar todas as posições?
sim é, um por um, é um roteiro rápido, aap! e é isso aí...
.........................
É isso que estou usando agora. Um conjunto de scripts - você usa este, depois aquele... Mas eu tentei codificar minha estratégia em Expert Advisor e encontrei uma série de dificuldades.
gince >> : Eu tenho algo que não funciona aqui, significa que não fecha nenhum erro.
Na função ClosePositions(), sua biblioteca b-Positions.mqh, KimIV usa uma chamada para sua outra função ClosePositionsBySelect() que proíbe o uso de ee no testador :
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
Para testes de história use sua biblioteca b-ForTest.mqh
Na função ClosePositions(), sua biblioteca b-Positions.mqh, KimIV usa uma chamada para sua outra função ClosePositionsBySelect() que proíbe o uso de ee no testador :
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
Para testes de história, use sua biblioteca b-ForTest.mqh
Você entendeu mal meu código... Traduzindo para russo... Se NÃO for permitido o modo de teste AND (EA NÃO é permitido negociar OU o Expert Advisor é interrompido), então aborte o loop. Para simplificar, esta linha garante a saída do loop, quando você pressiona o botão "Expert Advisors" na barra de ferramentas.
Infelizmente, há também uma discrepância com a matriz... Quando a contagem dos pedidos é feita com uma condição se os lotes forem maiores que 0 (Lts>0), os lotes são fechados um a um (quando o lucro foi alcançado), mas o lucro total deve ser levado em conta:
int Tip;// Тип ордераint Ticket=0,// Номер ордера
Tkt;// Количество номеров ордеровdouble Lot=0,// Количество закр. лотов
Lts;// Количество лотов всегоdouble Price_Cls;// Цена закрытия ордераint Errors;//--------------------------------------------------------------- 3 --for(int mm=1; mm<= Mas_Ord_Tek[0][0]; mm++)// Цикл по живым ордерам{if( Mas_Ord_Tek[ mm][6]== Tip &&// Среди ордеров нашего типа
Mas_Ord_Tek[ mm][5]> Lot &&// .. выбираем лоты
Mas_Ord_Tek[ mm][4]> Ticket)// .. выбираем номер ордера{// Этот больше ранее найден.
Lts= Mas_Ord_Tek[ mm][5]+ Lot;
Tkt= Mas_Ord_Tek[ mm][4]+ Ticket;}}if( Tip==0) Price_Cls=Bid;// Для ордеров Buyif( Tip==1) Price_Cls=Ask;// Для ордеров Sellif( BuyOrdProf>100&& Lts>0)
Ans=OrderClose( Tkt, Lts, Price_Cls,0,Red);// Закрыть все ордера
E em condições de contagem de pedidos, se os lotes forem mais de 1 (Lts>1), os lotes não são fechados:
int Tip;// Тип ордераint Ticket=0,// Номер ордера
Tkt;// Количество номеров ордеровdouble Lot=0,// Количество закр. лотов
Lts;// Количество лотов всегоdouble Price_Cls;// Цена закрытия ордераint Errors;//--------------------------------------------------------------- 3 --for(int mm=1; mm<= Mas_Ord_Tek[0][0]; mm++)// Цикл по живым ордерам{if( Mas_Ord_Tek[ mm][6]== Tip &&// Среди ордеров нашего типа
Mas_Ord_Tek[ mm][5]> Lot &&// .. выбираем лоты
Mas_Ord_Tek[ mm][4]> Ticket)// .. выбираем номер ордера{// Этот больше ранее найден.
Lts= Mas_Ord_Tek[ mm][5]+ Lot;
Tkt= Mas_Ord_Tek[ mm][4]+ Ticket;}}if( Tip==0) Price_Cls=Bid;// Для ордеров Buyif( Tip==1) Price_Cls=Ask;// Для ордеров Sellif( BuyOrdProf>100&& Lts>1)
Ans=OrderClose( Tkt, Lts, Price_Cls,0,Red);// Закрыть все ордера
Favor informar quem pode ver o erro.
Ou talvez, Igor, eu tenha um mal-entendido em usar sua função?
BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); // Função de chamada
//+----------------------------------------------------------------------------+//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |//+----------------------------------------------------------------------------+//| Версия : 19.02.2008 |//| Описание : Возвращает суммарный профит открытых позиций в валюте депозита |//+----------------------------------------------------------------------------+//| Параметры: |//| sy - наименование инструмента ("" - любой символ, |//| NULL - текущий символ) |//| op - операция (-1 - любая позиция) |//| mn - MagicNumber (-1 - любой магик) |//+----------------------------------------------------------------------------+double GetProfitOpenPosInCurrency(string sy="",int op=-1,int mn=-1){double p=0;int i, k=OrdersTotal();if( sy=="0") sy=Symbol();for( i=0; i< k; i++){if(OrderSelect( i, SELECT_BY_POS, MODE_TRADES)){if((OrderSymbol()== sy || sy=="")&&( op<0||OrderType()== op)){if(OrderType()==OP_BUY||OrderType()==OP_SELL){if( mn<0||OrderMagicNumber()== mn){
p+=OrderProfit()+OrderCommission()+OrderSwap();}}}}}return( p);}
Igor, por favor me diga como inserir sua função PriceOpenLastPos no indicador.
Ao compilar o editor dá erro no primeiro colchete e nas variáveis subseqüentes.
double PriceOpenLastPos( string sy="", int op=-1, int mn=-1) { datetime t; double r=0; int k=OrdersTotal();
if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy || sy===") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (t<OrderOpenTime()) { t=OrderOpenTime(); r=OrderOpenPrice(); } } } } } } } } return(r); } }
(' - definição de função inesperada D:\MT4\experts\indicators\Astrea.mq4 (627, 24) 'sy' - variável não definida D:\MT4\experts\Astrea.mq4 (632, 7) etc.
Eu implemento a lógica de formação de sinais de negociação em um indicador e envio o sinal gerado para o Expert Advisor através de uma variável global para abrir/fechar ordens.
Eu preciso do preço aberto de uma ordem para tomar algumas decisões, por isso estou tentando fazer isso. Meu indicador é dinâmico e só pode ser depurado em modo de demonstração ou em modo de visualização em um testador.
Angela, o compilador não esperava encontrar a definição da minha função neste lugar em particular. Isso significa que em algum lugar mais acima no código você tem algo em falta. Talvez um ponto-e-vírgula ou uma cinta de fechamento enrolada. De qualquer forma, verifique o código cuidadosamente.
kombat 17.07.2009 22:13
Some, compre 3 lotes e contraponha este volume venda 3 lotes
.......................
Como opção, sim. Embora, se já houver ordens de venda abertas, a EA pode fechar não as que você precisa. Deve ser resolvido.
kombat 17.07.2009 22:13.
Mas para responder à sua pergunta: é possível fechar todas as posições?
sim é, um por um, é um roteiro rápido, aap! e é isso aí...
.........................
É isso que estou usando agora. Um conjunto de scripts - você usa este, depois aquele... Mas eu tentei codificar minha estratégia em Expert Advisor e encontrei uma série de dificuldades.
Eu tenho algo que não funciona aqui, significa que não fecha nenhum erro.
Na função ClosePositions(), sua biblioteca b-Positions.mqh, KimIV usa uma chamada para sua outra função ClosePositionsBySelect() que proíbe o uso de ee no testador :
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
Para testes de história use sua biblioteca b-ForTest.mqh
Na função ClosePositions(), sua biblioteca b-Positions.mqh, KimIV usa uma chamada para sua outra função ClosePositionsBySelect() que proíbe o uso de ee no testador :
if (!IsTesting() && (!IsExpertEnabled() || IsStopped())) break;
Para testes de história, use sua biblioteca b-ForTest.mqh
Você entendeu mal meu código... Traduzindo para russo... Se NÃO for permitido o modo de teste AND (EA NÃO é permitido negociar OU o Expert Advisor é interrompido), então aborte o loop. Para simplificar, esta linha garante a saída do loop, quando você pressiona o botão "Expert Advisors" na barra de ferramentas.
Boa noite,
Infelizmente, há também uma discrepância com a matriz... Quando a contagem dos pedidos é feita com uma condição se os lotes forem maiores que 0 (Lts>0), os lotes são fechados um a um (quando o lucro foi alcançado), mas o lucro total deve ser levado em conta:
E em condições de contagem de pedidos, se os lotes forem mais de 1 (Lts>1), os lotes não são fechados:
Favor informar quem pode ver o erro.
Ou talvez, Igor, eu tenha um mal-entendido em usar sua função?
BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); // Função de chamada
Igor, por favor me diga como inserir sua função PriceOpenLastPos no indicador.
Ao compilar o editor dá erro no primeiro colchete e nas variáveis subseqüentes.
double PriceOpenLastPos( string sy="", int op=-1, int mn=-1) {
datetime t;
double r=0;
int k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==sy || sy===") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
if (t<OrderOpenTime()) {
t=OrderOpenTime();
r=OrderOpenPrice();
}
}
}
}
}
}
} }
return(r);
}
}
(' - definição de função inesperada D:\MT4\experts\indicators\Astrea.mq4 (627, 24)
'sy' - variável não definida D:\MT4\experts\Astrea.mq4 (632, 7)
etc.
Eu implemento a lógica de formação de sinais de negociação em um indicador e envio o sinal gerado para o Expert Advisor através de uma variável global para abrir/fechar ordens.
Eu preciso do preço aberto de uma ordem para tomar algumas decisões, por isso estou tentando fazer isso. Meu indicador é dinâmico e só pode ser depurado em modo de demonstração ou em modo de visualização em um testador.
A imagem é que não é o lucro total que é levado em conta, mas o lucro dos pedidos individuais.
BuyOrdProf=GetProfitOpenBuyPosInCurrency(OP_BUY); // Chamada de função
Parâmetro incorreto passando para a função. Deveria ser assim:
BuyOrdProf=GetProfitOpenBuyPosInCurrency("", OP_BUY);Parâmetro incorreto passando para a função. Deveria ser assim:
Acrescentar uma ligação ao símbolo na chamada de função não ajuda. Por que conta o lucro para cada posição separadamente (foto acima)?