Скрипт BUY

 

Как заставить скрипт выставлять TP и SL на минимально допустимый уровень?

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
//#property show_inputs
#include <WinUser32.mqh>
extern double Lots = 0;
extern int    LotsPercent = 10;
extern int    StopLoss = 100;
extern int    TakeProfit = 10;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
double LotsForTrade;
double LotsStep;
double LotsMin;
double LotsMax;
int LotsDigit;
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
void start()
{
   if (!IsCondition()) return;
   int slippage=5;
   double loss=0  ; if (StopLoss  >0) loss  =Ask-StopLoss  *Point;
   double profit=0; if (TakeProfit>0) profit=Ask+TakeProfit*Point;
   LotsStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP),2);
   LotsMin=NormalizeDouble(MarketInfo(Symbol(),MODE_MINLOT),2);
   LotsMax=NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT),2);
   if (LotsStep==0.01) LotsDigit=2; else LotsDigit=1;
   // расчет размера лота
   if (Lots==0) LotsForTrade=NormalizeDouble(AccountBalance()*LotsPercent/100000,LotsDigit); //AccountFreeMargin()
   else LotsForTrade=Lots;
   if (LotsForTrade>LotsMax) LotsForTrade=LotsMax;
   if (LotsForTrade<LotsMin) LotsForTrade=LotsMin;
   OrderSend(Symbol(), OP_BUY, LotsForTrade, Ask, slippage, loss, profit, NULL, 0, 0);
   ShowError();
}
bool IsCondition()
{
   bool result=true;
   string field="     ";
   string msg;
   string title="Ошибка";
   if (AccountNumber()>0) title=AccountNumber()+": "+title;
   if (!IsConnected())
   {
      msg=msg+"Связь с сервером отсутствует"+field;
      result=false;
   }
   if (!IsTradeAllowed())
   {
      if (!result) msg=msg+"\n";
      msg=msg+"Торговля запрещена"+field;
      result=false;
   }
   double freemargin=AccountFreeMargin();
   if(freemargin<=0)
   {
      if (!result) msg=msg+"\n";
      msg=msg+"Нет свободных средств"+field;
      result=false;
   }
   if (!result) MessageBox(msg,title,MB_OK|MB_ICONERROR);
   return (result);
   }
void ShowError()
   {
   string description;
   int err=GetLastError();
   switch (err)
   {
      case   0: return;
      case   1: description="Нет ошибки, но результат неизвестен"; break;
      case   2: description="Общая ошибка"; break;
      case   3: description="Неправильные параметры"; break;
      case   4: description="Торговый сервер занят"; break;
      case   5: description="Старая версия клиентского терминала"; break;
      case   6: description="Нет связи с торговым сервером"; break;
      case   7: description="Недостаточно прав"; break;
      case   8: description="Слишком частые запросы"; break;
      case   9: description="Недопустимая операция нарушающая функционирование сервера"; break;
      case  64: description="Счет заблокирован"; break;
      case  65: description="Неправильный номер счета"; break;
      case 128: description="Истек срок ожидания совершения сделки"; break;
      case 129: description="Неправильная цена"; break;
      case 130: description="Неправильные стопы"; break;
      case 131: description="Неправильный объем"; break;
      case 132: description="Рынок закрыт"; break;
      case 133: description="Торговля запрещена"; break;
      case 134: description="Недостаточно денег для совершения операции"; break;
      case 135: description="Цена изменилась"; break;
      case 136: description="Нет цен"; break;
      case 137: description="Брокер занят"; break;
      case 138: description="Новые цены"; break;
      case 139: description="Ордер заблокирован и уже обрабатывается"; break;
      case 140: description="Разрешена только покупка"; break;
      case 141: description="Слишком много запросов"; break;
      case 145: description="Модификация запрещена, так как ордер слишком близок к рынку"; break;
      case 146: description="Подсистема торговли занята"; break;
      case 147: description="Использование даты истечения ордера запрещено брокером"; break;
      default : description="Неизвестная ошибка"; break;
   }
   string field="     ";
   string msg="Ошибка #"+err+" "+description+field;
   string title="Ошибка";
   if (AccountNumber()>0)title=AccountNumber()+": "+title;
   MessageBox(msg,title,MB_OK|MB_ICONERROR);
}
// End
 
померять стоплевел и ставить согласно ему...
 
double Slevel=MarketInfo(Symbol(),MODE_STOPLEVEL);


для buy OrderSend(...,Ask-Slevel*Point...);
 
MOLET >>:

Ошибочка.

Для бай минимальное расстояние до стопов меряется от Бида.

 
komposter >>:

Ошибочка.

Для бай минимальное расстояние до стопов меряется от Бида.

Серьезно что ли?

 
komposter писал(а) >>

Ошибочка.

Для бай минимальное расстояние до стопов меряется от Бида.

double Slevel=MarketInfo(Symbol(),MODE_STOPLEVEL);
double Spread=MarketInfo(Symbol(),MODE_SPREAD);


для buy OrderSend(...,Ask-Spread*Point-Slevel*Point...);
;-)
 
TheXpert >>:

Серьезно что ли?

Ага.

 
MOLET >>:
;-)

Кхм... А зачем лишние телодвижения?

double Slevel=MarketInfo(Symbol(),MODE_STOPLEVEL);

для buy OrderSend(...,Bid-Slevel*Point...);