[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 13

 
keekkenen >> :

O problema é que a função OrderClose() que fecha o pedido toma o número do pedido como primeiro parâmetro, e o número do pedido só pode ser obtido chamando OrderSelect() nos pedidos existentes, então no caso geral o fechamento se parece com isto...


Se OrderTotal() = 0, ou seja, se não houver ordens em aberto, então o loop for é imediatamente terminado.



Obrigado pela resposta, você pode escrever o início da função OrderSend? ela deve ir logo após os últimos parênteses????

 
vadim2304 >> :

Obrigado pela resposta, você pode escrever o início da função OrderSend? ela deve ir logo após os últimos parênteses????

Bem, aqui vai um exemplo

#define              OP_BALANCE     6
int                  TRY            = 1;     
int                  TRADESLEEP     = 1000;  
int                  SLIPPAGE       = 3;

int start(){
   //  ничего не делать   
   int action = OP_BALANCE;

   if ( isTime(Period()*60)) {
      // закрываем ордера по текущему инструменту
      closeAllOrdersBySymbol( SLIPPAGE, TRY, TRADESLEEP);
   
   // получаем условие покупать, продавать, ничего не делать   
   action = getAction();
   
   if ( action== OP_BALANCE) return(0);
   
   // для примера минимальный лот   
   double lots = MarketInfo(Symbol(),MODE_MINLOT);
   
   //количество пунктов для стоплоса и текпрофита - сами определите
   int slPoint = 0, tpPoint = 0;
      
   string сomment = "";// значение для комментария по умолчанию
   int magicNumer = 0;// значение по умолчанию
   
   // открываем позицию - while используется для того чтобы открывать позицию пока она не откроется
   while(! openOrder( action, lots, slPoint, tpPoint, SLIPPAGE, сomment, magicNumer, TRY, TRADESLEEP)){}
   }
   return(0);     
}   
//+------------------------------------------------------------------+
//|  открывает  позицию по рынку                                     |
//+------------------------------------------------------------------+
int getAction(){
   int act = OP_BALANCE;
   
   /* здесь нужно написать логику, 
      если что-то, то покупать act = OP_BUY;
      если что-то, то продавать act = OP_SELL;   
   */
   return( act);
}
//+------------------------------------------------------------------+
//|  открывает  позицию по рынку                                     |
//+------------------------------------------------------------------+
bool openOrder(int type, double lots, int slPoint, int tpPoint, int slippage, string comment, 
               int magicNumer, int try, int tradeSleep){    
   bool res = false;
   int err = 0;   
   double price, tp = 0, sl = 0, ask = 0, bid = 0;  
   color col = CLR_NONE;
   Comment("Открытие ордера...");      
   
   while ( try != 0){
      while (IsTradeContextBusy() || !IsTradeAllowed()) {Comment("Торговый поток занят...");Sleep( tradeSleep);}        
      RefreshRates(); 
      ask = MarketInfo(Symbol(),MODE_ASK);
      bid = MarketInfo(Symbol(),MODE_BID);   
      if ( type==OP_BUY)  {
         price = ask; col = Red;
         if ( slPoint > 0) sl = bid - slPoint*Point; 
         if ( tpPoint > 0) tp = ask +  tpPoint*Point;
      }
      
      if ( type==OP_SELL) {
         price = bid; col = Blue;
         if ( slPoint > 0) sl = ask + slPoint*Point; 
         if ( tpPoint > 0) tp = bid - tpPoint*Point;   
      }           
            
      if ( type==OP_BUY && AccountFreeMarginCheck(Symbol(),OP_BUY, lots) <= 0 || GetLastError()==134) 
         {Comment("Недостаточно свободных средств !"); Sleep(2000);return( res);}
      if ( type==OP_SELL && AccountFreeMarginCheck(Symbol(),OP_SELL, lots) <= 0 || GetLastError()==134)
         {Comment("Недостаточно свободных средств !"); Sleep(2000);return( res);}            
      
      res = OrderSend(Symbol(), type, lots, price, slippage, sl, tp, comment, magicNumer,0, col);
      if ( res!=-1){    
         PlaySound("alert.wav");    
         try = 0;                          
         Comment("Ордер открыт !");          
      }else{
         err = GetLastError();
         if ( err > 1) try = 0;
         Comment("Ошибка - ", err);          
      }  
      Sleep(2000);       
   }  
   return( res);
}
//+------------------------------------------------------------------+
//|  закрытие одеров
//+------------------------------------------------------------------+  
bool closeAllOrdersBySymbol(int slippage,int try, int tradeSleep){
   int k = OrdersTotal(), err, nextTry;
   string msg = "";
   bool res = false;  
   
   for (int i = 0; i < k; i++) {
      if (OrderSelect( i, SELECT_BY_POS, MODE_TRADES) &&
         OrderSymbol()==Symbol()){ 
         nextTry = try;            
         while ( nextTry != 0){
            while (IsTradeContextBusy() || !IsTradeAllowed())
               {Comment("Торговый поток занят ...");Sleep( tradeSleep);}               
            res = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(), slippage,CLR_NONE);
            if ( res){                      
               nextTry = 0;
               res = true;    
               Comment("Ордер закрыт !");              
            }else{                                                          
               if ( err > 1) nextTry = 0;  
               Comment("Ошибка - ", err);        
            }                            
         }                         
      }
   }  
   return( res);
}
//+------------------------------------------------------------------+  
bool isTime(int sec){
   bool res = false;
   static datetime time = 0;
   double min = 0;
   if (TimeCurrent() >= time){
      min = MathFloor( sec / 60);
      if ( min==0) min = 1.0;         
      time = iTime(NULL,PERIOD_H1,0) + (MathFloor(Minute()/ min) + 1) * min * 60;
      res = true;
   } 
   return( res);
}
 
Pergunta simples para programadores:

Você pode me dizer qual função retorna o valor do nível da margem (em porcentagem) para pedidos abertos, que é mostrado na aba "Comércio" ?

No Help, nenhuma das funções listadas retorna este valor.

AccountMargin

AccountFreeMargin
AccountFreeMarginCheck
AccountFreeMarginMarginMode
 
khorosh >> :

O indicador Damiani_Volt pode ser usado.

Coisas interessantes, obrigado.

 
keekkenen >> :
lá está ele

Obrigado

 
satop >> :

O que o faz pensar que estou com raiva?

É apenas a minha maneira de explicar que

tomando qualquer sinal de desigualdade e correndo

>> no testador você pode obter um positivo

o resultado com algum nível, e não importa qual nível

positivo ou negativo. E quando perguntado

se deve tomar o nível com ou sem o menos,

não há distinção clara, infelizmente.


Eu posso ter cometido um erro..........

A questão é que o iniciante está perguntando o que NÃO SABE. Este exemplo de códigos serve para entender a estrutura (estrutura correta) da EA.

E o que está embutido neste pedaço de código é construído sobre um princípio comercial CLÁSSICO. Tanto o próprio Expert Advisor quanto as amostras de código são usados para estudar os princípios, e não para cutucar alguém ou pegá-lo em algo....... O que estou pedindo significa que não está claro. Afinal de contas, você DEVE entender teoricamente o quê e como. E depois criar, esculpir, inventar........

 
Você pode me dizer se é possível emitir um jpeg em um gráfico?
 
keekkenen 25.02.2009 11:34 1) Por favor explique, a função OrderSend(...) tem tipo int, e você a define como tipo bool, enquanto tipo bool não tem valor -1, quão correto é? 2) Em KimIV a função de abertura de posição se repete através de for(...), enquanto na sua função de abertura de posição se repete através de while(...). qual caminho você acha que é melhor?
 

1. isto é um erro... res deve ser declarado como int e outra variável do tipo bool deve ser adicionada para retornar o valor do sucesso/falha para abrir o pedido...

2. eu também usei uma das implementações da função OpenPosition() de Igor mais cedo, mas depois mudei a função para facilitar a captura e a comunicação de erros...

o resultado é a seguinte estrutura

while ( try != 0){
      // определение условий для открытыия позиции
      //..
     
      // открытие позициц
      res = OrderSend(...);
      
      if ( res > 0){ 
         PlaySound("alert.wav");    
         try = 0;                          
         Comment("Ордер открыт !"); 
         Sleep(2000);       
         ret = true;
      }else{
         /* блок определения ошибок и возврат 
          err - уровень критичности ошибки (0,1,2,3) 
          msg - описание ошибки (если showErrors = true)
          уровни определяются по номеру ошибки
          0-нет ошибки, 1-надо ждать и обновлять,
          2-сделка бракуется,3-фатальная ошибка*/
          
         ErrorBlock( showErrors, err, msg);
         if ( err > 1) try = 0;// в данном случае 2 и 3 критичны
         Comment("Ошибка - ", msg); 
         Sleep(2000);         
      }             
   }  
 
Se eu entendi corretamente, se há solicitações contínuas em sua função, então o número de tentativas é ilimitado, ao contrário do que acontece na função de Igor? É necessária alguma limitação neste caso?
Razão: