Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 6. - página 451

 
//+------------------------------------------------------------------+
//| eliminar e/ou fechar um pedido, filtrado por volume |
//---------------------------------------------------------------------
#property show_inputs
//--------------------------------------------------------------------
duplo MinLot externo = 0,01; //mínimo lote que deve ser excluído/fechado
duplo MaxLot externo = 0,1; //lote máximo que é excluído/bypassed
bool externo Comprar = falso; //apagar/fechar direção dos pedidos de compra
bool externo Vender = falso; //apagar/fechar direção das ordens de venda
bool pendente externo = verdadeiro; //apagar ordens pendentes
mercado externo = verdadeiro; // fechar posições no mercado
deslizamento interno externo = 2; // deslizamento de preço no fechamento de posições de mercado
//--------------------------------------------------------------------
int start()
{
duplo SL,TP;
string txt=StringConcatenate("Script remover ou fechar ordem, iniciar ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS);
RefreshRates();

bool error=true;
int Error,OT,Ticket,nn;
duplo OOP,OL;
enquanto (verdadeiro)
{
para (int j = OrderTotal()-1; j >= 0; j--)
{
se (OrderSelect(j, SELECT_BY_POS))
{
se ((OrderSymbol() == Symbol())
{
OL = OrderLots();
se (OL<MinLot || OL>MaxLot) continuar;
OT = OrderType();
se (!market && OT<2) continuar;
se (!pending && OT>1) continuar;
Ticket = OrderTicket();
OOP = OrderOpenPrice();
se (OT===OP_BUY)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Bid,Digits),slippage,Red);
if (error) txt = StringConcatenate(txt,"\nClosed BUY Order",Ticket);
else txt = StringConcatenate(txt,"\nClosing error ",GetLastError()));
}
se (OT===OP_SELL)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Ask,Digits),slippage,Blue);
se (erro) txt = StringConcatenate(txt, "SELL order closed",Ticket;)
else txt = StringConcatenate(txt,"\nError ",GetLastError()," fechar ",Ticket);
}
se (OT>1)
{
error=OrderDelete(Ticket);
if (error) txt = StringConcatenate(txt,"\nOrderDeleted ",StrOrdersType(OT)," ",Ticket);
else txt = StringConcatenate(txt,"\nError ",GetLastError()," remoção ",StrOrdersType(OT)," ",Ticket);
}
se (!erro)
{
Erro = GetLastError();
se (Erro<2) continuar;
se (Erro==129)
{ Comentário("Preço incorreto ",TimeToStr(TimeCurrent(),TIME_SECONDS))
Sleep(5000);
RefreshRates();
continuar;
}
se (Erro==146)
{
j++;
se (IsTradeContextBusy()) Sleep(2000);
continuar;
}
Comentário("Erro ",Erro", ordem de fechamento N ",OrderTicket(),
"TimeToStr(TimeCurrent(),TIME_SECONDS));
}
}
}
}
int n=0;
para (j = 0; j < OrderTotal(); j++)
{
se (OrderSelect(j, SELECT_BY_POS))
{
se (OrderSymbol() == Symbol())
{
OL = OrderLots();
se (OL<MinLot || OL>MaxLot) continuar;
OT = OrderType();
se (!market && OT<2) continuar;
se (!pending && OT>1) continuar;
n++;
}
}
}
se (n==0) quebra;
nn+++;
se (nn>10) {Comentário("Falha em fechar todas as negociações, ainda há ",n);break;}
Sleep(1000);
RefreshRates();
}
Comentário(txt,"\nScript has finished its work ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
retorno(0);
}
//--------------------------------------------------------------------
StrOrdersType(int t)
{
se (t===OP_BUY) retornar("Comprar");
if (t===OP_SELL) return("Sell");
se (t===OP_BUYLIMIT) retornar("BuyLimit");
se (t===OP_SELLLIMIT) retornar("SellLimit");
se (t===OP_BUYSTOP) retornar("BuyStop");
se (t===OP_SELLSTOP) retornar("SellStop");
}

//--------------------------------------------------------------------

O que devo acrescentar ou alterar no roteiro para fechar todas as ordens abertas para todos os pares por tamanho de lote.

 
Vitek, use o botão SRC para inserir o código! Quem precisa cavar através de rabiscos ilegíveis?!
 
pu6ka:
Sim, os preços de venda não são visíveis, mas são :)
No visualizador, você pode pressionar pausa e selecionar "Show Ask line" nas propriedades do gráfico e continuar os testes. A tabela de preços na MT4 é normalmente traçada pela Bid.

De que depende a qualidade dos testes e como pode ser aumentada ao máximo?
 
Zver4991:

e de que depende a qualidade dos testes e como pode ser melhorada ao máximo?
Sinceramente, não sei. Eu ainda não precisei, procure no site
 

Prezados Profissionais.
Você poderia me dizer como abrir uma grade de ordens pendentes sem usar ciclos?
Se não for difícil, mostre pelo menos um exemplo rudimentar de tal código,
com possibilidade de mudar de etapa e de tamanho de lote de cada ordem sucessiva da grade.

 
Forexman77:
Coloco linhas

em vez deint Ticket; os erros saem:

'=' - parêntese quadrada esquerda esperada para array('=' - parêntese quadrada esquerda, esperada para array)

>' - parêntese quadrada esquerda esperada para matriz ('=' - parêntese quadrada esquerda esperada para matriz)

>' - ficha inesperada ('>' - ficha inesperada)

')' - cessão esperada('' - cessão esperada )

"continuar" - "quebrar" ou "continuar" usado somente dentro de alguns laços )

e muito mais.


Portanto, o Ticket ainda está sendo usado em algum lugar na versão antiga. Precisamos de limpar o código...
 
1mql:

Prezados Profissionais.
Você poderia me dizer como abrir uma grade de ordens pendentes sem usar loops?
Se não for difícil, por favor mostre pelo menos um exemplo aproximado de tal código,
Se você puder mudar a etapa e o tamanho do lote de cada ordem subseqüente na grade.

Sim, na verdade, é o mesmo que em loop... ...mas sem o loop. Mostre-nos como você abre em loop e explique porque você não quer usar loops, porque não está claro o que você está tentando alcançar.
 
borilunad:
Vitek, use o botão SRC para colar o código! Quem precisa cavar através de rabiscos ilegíveis!

//+------------------------------------------------------------------+
//| удаления и/или закрытие ордера, с фильтрацией его по объему |
//---------------------------------------------------------------------
#property show_inputs
//--------------------------------------------------------------------
extern double MinLot = 0.01; //минимальный лот который удаляем/закываем
extern double MaxLot = 0.1; //максимальный лот который удаляем/закываем
extern bool Buy = false; //удалять/закрывать направление buy ордеров
extern bool Sell = false; //удалять/закрывать направление sell ордеров
extern bool pending = true; //удалить отложенные ордера
extern bool market = true ; //закрыть рыночные позиции
extern int slippage = 2; //проскальзывание цены при закрытии рыночных позиций
//--------------------------------------------------------------------
int start()
{
double SL,TP;
string txt=StringConcatenate("Скрипт удаления или закрытие ордера, старт ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
RefreshRates();

bool error=true;
int Error,OT,Ticket,nn;
double OOP,OL;
while(true)
{
for (int j = OrdersTotal()-1; j >= 0; j--)
{
if (OrderSelect(j, SELECT_BY_POS))
{
if ((OrderSymbol() == Symbol()))
{
OL = OrderLots();
if (OL<MinLot || OL>MaxLot) continue;
OT = OrderType();
if (!market && OT<2) continue;
if (!pending && OT>1) continue;
Ticket = OrderTicket();
OOP = OrderOpenPrice();
if (OT==OP_BUY)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Bid,Digits),slippage,Red);
if (error) txt = StringConcatenate(txt,"\nЗакрыт ордер BUY ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка закрытия ",GetLastError());
}
if (OT==OP_SELL)
{
error=OrderClose(Ticket,OrderLots(),NormalizeDouble(Ask,Digits),slippage,Blue);
if (error) txt = StringConcatenate(txt,"\nЗакрыт ордер SELL ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка ",GetLastError()," закрытия ",Ticket);
}
if (OT>1)
{
error=OrderDelete(Ticket);
if (error) txt = StringConcatenate(txt,"\nУдален ордер ",StrOrdersType(OT)," ",Ticket);
else txt = StringConcatenate(txt,"\nОшибка ",GetLastError()," удаления ",StrOrdersType(OT)," ",Ticket);
}
if (!error)
{
Error = GetLastError();
if (Error<2) continue;
if (Error==129)
{ Comment("Неправильная цена ",TimeToStr(TimeCurrent(),TIME_SECONDS));
Sleep(5000);
RefreshRates();
continue;
}
if (Error==146)
{
j++;
if (IsTradeContextBusy()) Sleep(2000);
continue;
}
Comment("Ошибка ",Error," закрытия ордера N ",OrderTicket(),
" ",TimeToStr(TimeCurrent(),TIME_SECONDS));
}
}
}
}
int n=0;
for (j = 0; j < OrdersTotal(); j++)
{
if (OrderSelect(j, SELECT_BY_POS))
{
if (OrderSymbol() == Symbol())
{
OL = OrderLots();
if (OL<MinLot || OL>MaxLot) continue;
OT = OrderType();
if (!market && OT<2) continue;
if (!pending && OT>1) continue;
n++;
}
}
}
if (n==0) break;
nn++;
if (nn>10) {Comment("Не удалось закрыть все сделки, осталось еще ",n);break;}
Sleep(1000);
RefreshRates();
}
Comment(txt,"\nСкрипт закончил свою работу ",TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
return(0);
}
//--------------------------------------------------------------------
string StrOrdersType(int t)
{
if (t==OP_BUY) return("Buy");
if (t==OP_SELL) return("Sell");
if (t==OP_BUYLIMIT) return("BuyLimit");
if (t==OP_SELLLIMIT) return("SellLimit");
if (t==OP_BUYSTOP) return("BuyStop");
if (t==OP_SELLSTOP) return("SellStop");
}
//--------------------------------------------------------------------

O que devo acrescentar ou alterar para fechar todos os pedidos abertos em todos os pares por tamanho de lote.

 
Vitek2010:

O que devo acrescentar ou alterar para fechar todos os pedidos abertos em todos os pares por tamanho de lote.

Abaixo do último externo:
escorregamento interno externo = 2; // escorregamento de preço ao fechar posições no mercado

inserir outro:
bool total_symb externo = verdadeiro; // em todos os pares

e em cada linha:
se ((OrderSymbol() == Symbol())
и
if(OrderSymbol() == Símbolo())

substitua por este:
se(OrderSymbol() == Symbol() || total_symb)

Teoricamente, deve funcionar, verifique.

 
Surgiu a questão, é possível escrever um Expert Advisor ou roteiro, que seria, por exemplo, conseguir uma perda de 2% no dia, fecharia todas as transações?