Ну не работает!

 
Почему?:

//+------------------------------------------------------------------+
//|                                                    a_SELLMAX.mq4 |
//|                            Скрипт должен открыть SELL по наглому |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property show_inputs // Если есть желание менять экстерны в процессе
extern int    Distance      = 20;      // Расстояние от рынка
extern int    Slippage      = 5;       // Проскальзывание цены
extern bool   stoplos       = true;    // Ставить или нет
extern bool   takeprofit    = true;    // Ставить или нет
extern double step          = 0.1;     // Шаг округления величины позы
//+------------------------------------------------------------------+
void start() 
{
int    ticket;
double SL=0,TP=0,stake;
   stake=step;
   while(AccountFreeMargin()>stake*1000) stake=stake+step;
   stake=stake-step;
   if(AccountFreeMargin()<(1000*stake))
   {
       Print("We have no money. Free Margin = ", AccountFreeMargin());
       return(0);  
   }
   if(stoplos==true) SL=Ask+Distance*Point;
   if(takeprofit==true) TP=Bid-2*Distance*Point;
   ticket=OrderSend(Symbol(),OP_SELL,stake,Bid,Slippage,SL,TP,"",0,0,CLR_NONE);
   if(ticket>0)
   {
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
          Print("SELL order opened : ",OrderOpenPrice());
   }
   else
   {
      Print("Error opening BUY order : ",GetLastError()); 
      return(0);
   }
}
//+------------------------------------------------------------------+
 
Без запуска можно сказать, что:
1. нет NormalizeDouble у SL, TP
2. нет NormalizeDouble у stake
 
Renat:
Без запуска можно сказать, что:
1. нет NormalizeDouble у SL, TP
2. нет NormalizeDouble у stake

Спасибо, попробую.
Но при заданном фиксированном лоте (1.0, 0.1, ...) тот же скрипт работает с ненормализованными SL, TP.

Поставил только:
NormalizeDouble(stake,1);
все заработало.
Кстати, Ваш тест стопов дал хороший результат: он свел мне и SL, и TP в Bid и на первом же тике закрыл позу (на демо, есствено), Ask у Вас игнорируется. Так я узнал, что брокер позволяет ставить стопы вплотную к рынку :).
 
Bookkeeper:

Кстати, Ваш тест стопов дал хороший результат: он свел мне и SL, и TP в Bid и на первом же тике закрыл позу (на демо, есствено), Ask у Вас игнорируется. Так я узнал, что брокер позволяет ставить стопы вплотную к рынку :).
Все зависит от настроек сервера. Такими темпами брокеры скоро и до нулевого спреда дойдут.
 
Renat:
....... Такими темпами брокеры скоро и до нулевого спреда дойдут.

Щазzzzzz. Хотя я где-то на форумах читал о брокерах со спредом 0, 5п. Правда там депо ого-го какой надо.
Попутно (продолжаю тему) посмотрите скрипт плиz:

//+------------------------------------------------------------------+
//|                                                     Open_BUY.mq4 |
//|                         Скрипт открывает BUY (если есть денюшка) |
//|                       Поза округляется до заданной части от депо |
//|                           Bookkeeper, 2006, yuzefovich@gmail.com |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property show_inputs // Если есть желание менять экстерны в процессе
extern double share         = 1.0;   // Поза как часть депо 0.01-1.00
extern int    Slippage      = 5;     // Проскальзывание
extern int    DistSL        = 35;    // Расстояние до SL
extern int    DistTP        = 35;    // Расстояние до TP
extern bool   stoplos       = true;  // Ставить или нет
extern bool   takeprofit    = true;  // Ставить или нет
 
//+------------------------------------------------------------------+
void start() 
{
int    ticket;
double SL=0,TP=0,stake,sharedepo;
double step=MarketInfo(Symbol(),MODE_MINLOT);   
int    dgts=MarketInfo(Symbol(),MODE_DIGITS);     
   sharedepo=AccountFreeMargin()*share;
   if(sharedepo>step*1000)
   {
      stake=2*step;
      while(sharedepo>stake*1000) stake=stake+step;
      stake=stake-step;
   }
   else stake=step;
   NormalizeDouble(stake,1);
   if(AccountFreeMargin()<stake*1000)
   {
       Print("We have no money. Free Margin = ", AccountFreeMargin());
       return(0);  
   }
   if(stoplos==true) SL=Bid-DistSL*Point;
   if(takeprofit==true) TP=Ask+2*DistTP*Point;
   ticket=OrderSend(Symbol(),OP_BUY,stake,Ask,Slippage,
                    NormalizeDouble(SL,dgts),
                    NormalizeDouble(TP,dgts),
                    "",0,0,CLR_NONE);
   if(ticket>0)
   {
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
          Print("BUY order opened : ",OrderOpenPrice());
   }
   else
   {
      Print("Error opening BUY order : ",GetLastError()); 
      return(0);
   }
}
//+------------------------------------------------------------------+
в части определения stake. Как можно определить stake, чтоб не пролететь с округлением Double? А то перебором, как здесь - это унизительно.
 
Bookkeeper писал (а):
   sharedepo=AccountFreeMargin()*share;
   if(sharedepo>step*1000)
   {
      stake=2*step;
      while(sharedepo>stake*1000) stake=stake+step;
      stake=stake-step;
   }
   else stake=step;
   NormalizeDouble(stake,1);

Вот этот блок. В том числе - как нормализовать stake с той же точностью, что и MINLOT.
 
stake=NormalizeDouble(stake,1);
if(stake<MarketInfo(Symbol(),MODE_MINLOT)) stake=MarketInfo(Symbol(),MODE_MINLOT);
if(stake>MarketInfo(Symbol(),MODE_MAXLOT)) stake=MarketInfo(Symbol(),MODE_MAXLOT);
 
Не совсем то. Зато теперь работает все. ИСПРАВЛЕНО (?)
//+------------------------------------------------------------------+
//|                                                    _Open_BUY.mq4 |
//|                                           "СКРИПТЫ ДЛЯ ЛЕНИВОГО" |
//|                         Скрипт открывает BUY (если есть денюшка) |
//|                 Поза округляется до заданной части Share от депо |
//|                           Bookkeeper, 2006, yuzefovich@gmail.com |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property show_inputs // Если есть желание менять экстерны в процессе
extern double Share         = 1.0;   // Поза как часть депо 0.01-1.00
extern int    DistSL        = 35;    // Расстояние до SL
extern int    DistTP        = 35;    // Расстояние до TP
extern int    Slippage      = 5;     // Проскальзывание
extern bool   StopLoss      = true;  // Ставить или нет
extern bool   TakeProfit    = true;  // Ставить или нет
 
//+------------------------------------------------------------------+
void start() 
{
int    ticket;
double SL=0,TP=0,Stake,StepDgts;
double Step=MarketInfo(Symbol(),MODE_MINLOT);   
int    Dgts=MarketInfo(Symbol(),MODE_DIGITS);     
   if(Share>1.0) Share=1.0; // Часть не бывает больше целого
   if(Step<0.1) StepDgts=2;
   else
   {
      if(Step<1.0) StepDgts=1;
      else StepDgts=0;
   }
   Stake=NormalizeDouble(AccountFreeMargin()*Share/1000/Ask,StepDgts);
   if(AccountFreeMargin()<Stake*1000*Ask) // Округление бывает и вверх
      Stake=NormalizeDouble(Stake-Step,StepDgts); // Теперь лишку не будет  
   if(Stake<Step) return(0);
   if(StopLoss==true) SL=Bid-DistSL*Point;
   if(TakeProfit==true) TP=Ask+2*DistTP*Point;
   ticket=OrderSend(Symbol(),OP_BUY,Stake,Ask,Slippage,
                    NormalizeDouble(SL,Dgts),
                    NormalizeDouble(TP,Dgts),
                    "",0,0,CLR_NONE);
   if(ticket>0)
   {
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
          Print("BUY order opened : ",OrderOpenPrice());
   }
   else
   {
      Print("Error opening BUY order : ",GetLastError()); 
      return(0);
   }
}
//+------------------------------------------------------------------+

И то же для шорта:
//+------------------------------------------------------------------+
//|                                                   _Open_SELL.mq4 |
//|                                           "СКРИПТЫ ДЛЯ ЛЕНИВОГО" |
//|                        Скрипт открывает SELL (если есть денюшка) |
//|                 Поза округляется до заданной части Share от депо |
//|                           Bookkeeper, 2006, yuzefovich@gmail.com |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property show_inputs // Если есть желание менять экстерны в процессе
extern double Share         = 1.0;   // Поза как часть депо 0.01-1.00
extern int    DistSL        = 35;    // Расстояние до SL
extern int    DistTP        = 35;    // Расстояние до TP
extern int    Slippage      = 5;     // Проскальзывание
extern bool   StopLoss      = true;  // Ставить или нет
extern bool   TakeProfit    = true;  // Ставить или нет
//+------------------------------------------------------------------+
void start() 
{
int    ticket;
double SL=0,TP=0,Stake,StepDgts;
double Step=MarketInfo(Symbol(),MODE_MINLOT);   
int    Dgts=MarketInfo(Symbol(),MODE_DIGITS);     
   if(Share>1.0) Share=1.0; // Часть не бывает больше целого
   if(Step<0.1) StepDgts=2;
   else
   {
      if(Step<1.0) StepDgts=1;
      else StepDgts=0;
   }
   Stake=NormalizeDouble(AccountFreeMargin()*Share/1000/Ask,StepDgts);
   if(AccountFreeMargin()<Stake*1000*Bid) // Округление бывает и вверх
      Stake=NormalizeDouble(Stake-Step,StepDgts); // Теперь лишку не будет  
   if(Stake<Step) return(0);
   if(StopLoss==true) SL=Ask+DistSL*Point;
   if(TakeProfit==true) TP=Bid-2*DistTP*Point;
   ticket=OrderSend(Symbol(),OP_SELL,Stake,Bid,Slippage,
                    NormalizeDouble(SL,Dgts),
                    NormalizeDouble(TP,Dgts),
                    "",0,0,CLR_NONE);
   if(ticket>0)
   {
      if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
          Print("SELL order opened : ",OrderOpenPrice());
   }
   else
   {
      Print("Error opening BUY order : ",GetLastError()); 
      return(0);
   }
}
//+------------------------------------------------------------------+
 
Вы неправильно пользуетесь NormalizeDouble.
Строки такого вида абсолютно бесполезны, так как результат нормализации никуда не присваивается.
NormalizeDouble(Stake,StepDgts);
 
Renat:
Вы неправильно пользуетесь NormalizeDouble.
Строки такого вида абсолютно бесполезны, так как результат нормализации никуда не присваивается.
NormalizeDouble(Stake,StepDgts);

Спасибо! Отредактировал (пред. пост). Надеюсь теперь ничего не напортачил?
Причина обращения: