Muito obrigado, Sergei ! Se bem entendi: No primeiro caso, é criado um conjunto de variáveis estáticas, cada uma para o seu próprio símbolo com um período de tempo fixo, ou seja, nenhum outro período de tempo pode ser utilizado para esse símbolo; No segundo caso, uma classe para cada combinação de símbolo + período de tempo.
MikeZv: Muito obrigado, Sergei ! Se bem entendi: No primeiro caso, é criado um conjunto de variáveis estáticas, cada uma para o seu próprio símbolo com um período de tempo fixo, ou seja, nenhum outro período de tempo pode ser utilizado para esse símbolo; No segundo caso, uma classe para cada combinação de um símbolo+timeframe.
Sim, certo, mas se pensar um pouco, pode substituir a matriz unidimensional por uma bidimensional na variante da matriz.
Tal questão. Alguém em algum lugar viu um modelo de código para abrir, verificar e fechar encomendas, sem uma condição de abertura e fecho? Eu próprio tentarei escrever uma condição, mas erro sobre erro quando começo a escrever uma ordem de fecho... Especialmente, sou mau a encontrar e a verificar encomendas para fechar.
Vitaliy Medvedev: Aqui está uma questão. Alguém em qualquer outro lugar viu o código modelo para abertura, verificação e encerramento de encomendas sem quaisquer condições de abertura e encerramento? Eu próprio tentei escrever uma condição, mas quando comecei a escrever um erro de ordem de fecho sobre o erro... Especialmente, sou mau em encontrar e verificar ordens para as fechar.
Não é surpreendente que não funcione bem. Afinal, se não houver condições de fecho, então encontrar e verificar tais ordens deve estar no espírito de: encontrar isto, não sei o quê, e fechá-lo.
Deve primeiro definir as condições para a escolha da ordem a ser fechada, e depois será muito mais fácil analisá-la. Afinal de contas, se houver algum mal-entendido, teremos apenas de verificar o cumprimento das condições conhecidas.
Não é surpreendente que não funcione bem. Se não tivermos condições de fecho, então a busca e verificação de tais ordens deve ser no seguinte espírito: encontrar algo e fechá-lo.
Primeiro, decidir sobre as condições de selecção das encomendas para encerramento e, em seguida, será mais fácil de as ordenar. Se houver algum mal-entendido, teremos apenas de verificar se as condições que sabemos ao certo são correctas.
Tudo isto é claro, defini as condições, mas a abertura das encomendas de acordo com as condições (a abertura ainda é um lixo, posso abri-las com pena...),
E mais ainda, oencerramento correctodas encomendas ... Que confusão!
Está tudo claro, já trabalhei as condições, mas a abertura das ordens de acordo com as condições, (abertura ainda é um disparate, abertura, com um pouco de luta...),
E mais ainda, oencerramento correctodas encomendas ... Que confusão!
Se souber que ordem escolheu para fechar, então feche-a pelo seu número de bilhete.
Está tudo claro, já trabalhei as condições, mas a abertura das ordens de acordo com as condições, (abertura ainda é um disparate, abertura, com dificuldade...),
E mais ainda, oencerramento correctodas encomendas ... Que confusão!
Eis como é arrancado do meu coração
int Total_orders(int type)
{
int n=0;
int total=OrdersTotal();
for(int i=0; i<total; i++)
{
if(!OrderSelect(i,SELECT_BY_POS))continue;
if(OrderType()!=type)continue;
if(OrderMagicNumber()!=Magic)continue;
if(OrderSymbol()!=_Symbol)continue;
n++;
}
return(n);
}
//+------------------------------------------------------------------+void OrderOpen(int type,double sl)
{
double price=0.0;
double lot;
if(error>1)return;
if(type==WRONG_VALUE) return;
if(Risk!=0.0)lot=LotNormalize(LotVolume(Risk,sl));
else lot=LotNormalize(Lot);
do
{
if(type==OP_BUY)
{
RefreshRates();
price=NormalizeDouble(Ask,_Digits);
if(AccountFreeMarginCheck(_Symbol,type,lot)<=0)return;
}
if(type==OP_SELL)
{
RefreshRates();
price=NormalizeDouble(Bid,_Digits);
if(AccountFreeMarginCheck(_Symbol,type,lot)<=0)return;
}
int Ticket=OrderSend(_Symbol,type,lot,price,10000,0,0,CommentOrder,Magic);
if(Ticket>0)
{
error=Fun_Error(_Symbol,GetLastError());
Alert(__FUNCTION__,": open order ",StrToType(type)," ",_Symbol," :",Ticket);
}
else error=Fun_Error(_Symbol,GetLastError());
}
while(error==1 && !IsStopped());
}
//+------------------------------------------------------------------+void Order_Close(int type)
{
double price=0.0;
int total=OrdersTotal();
if(error>1)return;
for(int i=total-1; i>=0; i--)
{
if(!OrderSelect(i,SELECT_BY_POS))continue;
if(OrderType()!=type)continue;
if(OrderMagicNumber()!=Magic)continue;
if(OrderSymbol()!=_Symbol)continue;
do
{
if(OrderType()==OP_BUY)
{
RefreshRates();
price=NormalizeDouble(Bid,_Digits);
}
if(OrderType()==OP_SELL)
{
RefreshRates();
price=NormalizeDouble(Ask,_Digits);
}
int res=OrderClose(OrderTicket(),OrderLots(),price,10000);
if(res)
{
Alert(__FUNCTION__,": close order ",StrToType(OrderType())," ",OrderSymbol()," :",OrderTicket());
error=Fun_Error(_Symbol,GetLastError());
}
else error=Fun_Error(_Symbol,GetLastError());
}
while(error==1 && !IsStopped());
}
}
//+------------------------------------------------------------------+void ModifySL(int Stop_Loss)
{
if(Stop_Loss<=0)return;
double sl=0.0;
bool res;
int total=OrdersTotal();
for(int i=0; i<total; i++)
{
if(!OrderSelect(i,SELECT_BY_POS))continue;
if(OrderMagicNumber()!=Magic)continue;
if(OrderSymbol()!=_Symbol)continue;
if(OrderStopLoss()!=0)continue;
if(OrderType()==OP_BUY) sl=NormalizeDouble(OrderOpenPrice()-(New_Stop(Stop_Loss)*_Point),_Digits);
if(OrderType()==OP_SELL) sl=NormalizeDouble(OrderOpenPrice()+(New_Stop(Stop_Loss)*_Point),_Digits);
res=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0);
if(!res)Print(__FUNCTION__,": Error modifying StopLoss order ",StrToType(OrderType())," № - ",GetLastError()," ",OrderSymbol()," ",OrderTicket());
}
}
//+------------------------------------------------------------------+void ModifyTP(int Take_Profit)
{
if(Take_Profit<=0)return;
double tp=0.0;
bool res;
int total=OrdersTotal();
for(int i=0; i<total; i++)
{
if(!OrderSelect(i,SELECT_BY_POS))continue;
if(OrderMagicNumber()!=Magic)continue;
if(OrderSymbol()!=_Symbol)continue;
if(OrderTakeProfit()!=0)continue;
if(OrderType()==OP_BUY) tp=NormalizeDouble(OrderOpenPrice()+(New_Stop(Take_Profit)*_Point),_Digits);
if(OrderType()==OP_SELL) tp=NormalizeDouble(OrderOpenPrice() -(New_Stop(Take_Profit)*_Point),_Digits);
res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),tp,0);
if(!res)Print(__FUNCTION__,": Error modifying TakeProfit order ",StrToType(OrderType())," № - ",GetLastError()," ",OrderSymbol()," ",OrderTicket());
}
}
//+------------------------------------------------------------------+double LotVolume(double procent,double sl)
{
double lot=0.0;
double tv=MarketInfo(_Symbol,MODE_TICKVALUE);
double minlot=MarketInfo(_Symbol,MODE_MINLOT);
double maxlot=MarketInfo(_Symbol,MODE_MAXLOT);
if(sl!=0 && tv!=0) lot=(AccountFreeMargin()*procent)/(sl*tv*100.0);
if(lot < minlot)lot = minlot;
if(lot > maxlot)lot = maxlot;
return(lot);
}
//+------------------------------------------------------------------+double LotNormalize(double lot)
{
double minlot=MarketInfo(_Symbol,MODE_MINLOT);
double maxlot=MarketInfo(_Symbol,MODE_MAXLOT);
if(lot < minlot)lot = minlot;
if(lot > maxlot)lot = maxlot;
if(minlot==0.001) return(NormalizeDouble(lot,3));
if(minlot==0.01) return(NormalizeDouble(lot,2));
if(minlot==0.1) return(NormalizeDouble(lot,1));
return(NormalizeDouble(lot,0));
}
//+------------------------------------------------------------------+string StrToType(int type)
{
if(type==OP_BUY)return("Buy");
if(type==OP_SELL)return("Sell");
return(NULL);
}
//+------------------------------------------------------------------+int New_Stop(int Parametr)
{
int Min_Dist=(int)MarketInfo(_Symbol,MODE_STOPLEVEL);
if(Parametr<Min_Dist)
{
Parametr=Min_Dist*2+(int)MarketInfo(_Symbol,MODE_SPREAD);
Alert(_Symbol," Увеличина дистанция стоп-приказа.");
}
return(Parametr);
}
//+------------------------------------------------------------------+int Fun_Error(string symbol,int Error)
{
switch(Error)
{
case0:return(0);
case1:Alert(symbol," ",Error,":No error returned, but the result is unknown");return(2);
case2:Alert(symbol," ",Error,":Common error");return(2);
case3:Alert(symbol," ",Error,":Invalid trade parameters");return(2);
case4:Alert(symbol," ",Error,":Trade server is busy");Sleep(3000);return(1);
case5:Alert(symbol," ",Error,":Old version of the client terminal");return(2);
case6:Alert(symbol," ",Error,":No connection with trade server");Sleep(3000);return(1);
case7:Alert(symbol," ",Error,":Not enough rights");return(2);
case8:Alert(symbol," ",Error,":Too frequent requests");return(2);
case9:Alert(symbol," ",Error,":Malfunctional trade operation");return(2);
case64:Alert(symbol," ",Error,":Account disabled");return(2);
case65:Alert(symbol," ",Error,":Invalid account");return(2);
case128:Alert(symbol," ",Error,":Trade timeout");return(1);
case129:Alert(symbol," ",Error,":Invalid price");return(2);
case130:Alert(symbol," ",Error,":Invalid stops");return(2);
case131:Alert(symbol," ",Error,":Invalid trade volume");return(2);
case132:Alert(symbol," ",Error,":Market is closed");Sleep(10000);return(1);
case133:Alert(symbol," ",Error,":Trade is disabled");return(2);
case134:Alert(symbol," ",Error,":Not enough money");return(2);
case135:Alert(symbol," ",Error,":Price changed");return(1);
case136:Alert(symbol," ",Error,":Off quotes");Sleep(3000);return(1);
case137:Alert(symbol," ",Error,":Broker is busy");Sleep(3000);return(1);
case138:Alert(symbol," ",Error,":Requote");return(1);
case139:Alert(symbol," ",Error,":Order is locked");Sleep(10000);return(1);
case140:Alert(symbol," ",Error,":Buy orders only allowed");return(2);
case141:Alert(symbol," ",Error,":Too many requests");return(2);
case145:Alert(symbol," ",Error,":Modification denied because order is too close to market");Sleep(10000);return(1);
case146:Alert(symbol," ",Error,":Trade context is busy");Sleep(3000);return(1);
case147:Alert(symbol," ",Error,":Expirations are denied by broker");return(2);
case148:Alert(symbol," ",Error,":The amount of open and pending orders has reached the limit set by the broker");return(2);
case149:Alert(symbol," ",Error,":An attempt to open an order opposite to the existing one when hedging is disabled");return(2);
case150:Alert(symbol," ",Error,":An attempt to close an order contravening the FIFO rule");return(2);
default:Alert(symbol,":Error - № ",Error);return(2);
}
return(0);
}
Aqui está outra opção usando a classe
Resultado do teste
No primeiro caso, é criado um conjunto de variáveis estáticas, cada uma para o seu próprio símbolo com um período de tempo fixo, ou seja, nenhum outro período de tempo pode ser utilizado para esse símbolo;
No segundo caso, uma classe para cada combinação de símbolo + período de tempo.
Muito obrigado, Sergei ! Se bem entendi:
No primeiro caso, é criado um conjunto de variáveis estáticas, cada uma para o seu próprio símbolo com um período de tempo fixo, ou seja, nenhum outro período de tempo pode ser utilizado para esse símbolo;
No segundo caso, uma classe para cada combinação de um símbolo+timeframe.
Aqui está uma questão. Alguém em qualquer outro lugar viu o código modelo para abertura, verificação e encerramento de encomendas sem quaisquer condições de abertura e encerramento? Eu próprio tentei escrever uma condição, mas quando comecei a escrever um erro de ordem de fecho sobre o erro... Especialmente, sou mau em encontrar e verificar ordens para as fechar.
Não é surpreendente que não funcione bem. Afinal, se não houver condições de fecho, então encontrar e verificar tais ordens deve estar no espírito de: encontrar isto, não sei o quê, e fechá-lo.
Deve primeiro definir as condições para a escolha da ordem a ser fechada, e depois será muito mais fácil analisá-la. Afinal de contas, se houver algum mal-entendido, teremos apenas de verificar o cumprimento das condições conhecidas.
Não é surpreendente que não funcione bem. Se não tivermos condições de fecho, então a busca e verificação de tais ordens deve ser no seguinte espírito: encontrar algo e fechá-lo.
Primeiro, decidir sobre as condições de selecção das encomendas para encerramento e, em seguida, será mais fácil de as ordenar. Se houver algum mal-entendido, teremos apenas de verificar se as condições que sabemos ao certo são correctas.
Tudo isto é claro, defini as condições, mas a abertura das encomendas de acordo com as condições (a abertura ainda é um lixo, posso abri-las com pena...),
E mais ainda, oencerramento correctodas encomendas ... Que confusão!
Está tudo claro, já trabalhei as condições, mas a abertura das ordens de acordo com as condições, (abertura ainda é um disparate, abertura, com um pouco de luta...),
E mais ainda, oencerramento correctodas encomendas ... Que confusão!
Está tudo claro, já trabalhei as condições, mas a abertura das ordens de acordo com as condições, (abertura ainda é um disparate, abertura, com dificuldade...),
E mais ainda, oencerramento correctodas encomendas ... Que confusão!
Eis como é arrancado do meu coração
Eis como o obtenho do meu coração.
Oh... Não me digas! Eu não tenho feito tanto...! Sim, bem... Agora sei porque é que as coisas não funcionam como deveriam.
Muito obrigado, humanamente.
Segura-o como se fosse do meu coração.
Posso perguntar porque está a fazer isto?
int total=OrdensTotal();
Posso perguntar porque se faz isto?
int total=OrdensTotal();