← К каталогу
Исходный код · ID 591

Ascal

sell stop buy stop.mq4
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Ascal — торговый советник для MetaTrader 4, автоматизирующий размещение Buy Stop и Sell Stop ордеров на основе скорости изменения цены. Советник отслеживает динамику цены за заданный промежуток времени и открывает стоп-ордера при достижении порогового значения.

Внутри советника реализованы управление открытыми позициями с использованием трейлинг-стопа, защита от просадки, фильтрация по спреду и расчёт комиссии на основе истории торгов. Лот рассчитывается либо от фиксированного значения, либо на основе процента риска от баланса.

Советник отображает на графике информационную панель с текущими параметрами: спредом, лотом, плечом, комиссией и временем GMT. Работает на платформе MetaTrader 4 с обработкой тиков и торговых событий.

Настройки программы

НастройкаОписание
TradeComment Комментарий, присваиваемый торговым ордерам советника
MagicNumber Магический номер для идентификации ордеров, размещённых советником
Slippage Допустимое проскальзывание цены в пунктах при отправке торговых ордеров
MaxSpread Максимально допустимый средний спред в пунктах для открытия ордеров
FixedLot Фиксированный размер лота. Если значение больше нуля, используется фиксированный лот; иначе лот рассчитывается автоматически
RiskPercent Процент риска от баланса, используемый для автоматического расчёта размера лота
MaxDrawdown Максимально допустимая просадка в процентах от начального баланса для управления позициями
StartHour Час начала торговли в формате GMT
EndHour Час окончания торговли в формате GMT
GMTOffset Смещение часового пояса GMT для корректировки времени торговых сессий
Trailing Расстояние трейлинг-стопа в пунктах для защиты прибыли на открытых позициях
Profit Минимальная прибыль в пунктах для активации трейлинг-стопа на позиции
VelocityTrigger Порог скорости изменения цены в пунктах для срабатывания открытия стоп-ордеров
Offset Отступ в пунктах для размещения Buy Stop и Sell Stop ордеров от текущей цены
Получить полный код

Поиск по коду файла

#property strict
#property version "1.04" 

extern string TradeComment = "Ascal v1.04"; 
extern int MagicNumber = 101; 
extern int Slippage = 3;
extern int MaxSpread = 262;
extern double FixedLot = 0;
extern int RiskPercent = 20; 
extern int MaxDrawdown = 3;  
extern int StartHour = 19; 
extern int EndHour = 1;
extern int GMTOffset = 0;
extern int Trailing = 7;   
extern int Profit = 13; 
extern int VelocityTrigger = 50; 
extern int Offset = 11;
int VelocityTime = 7;   

int OrderExpiry = 15; 
int TickSample = 100;  
int r, gmt, brokerOffset, size, digits, stoplevel;

double marginRequirement, maxLot, minLot, lotSize, points, currentSpread, avgSpread, maxSpread, initialBalance, rateChange, rateTrigger, deleteRatio, commissionPoints;

double spreadSize[]; 
double tick[];
double avgtick[];
int tickTime[];   

string testerStartDate, testerEndDate; 

int lastBuyOrder, lastSellOrder;

bool calculateCommission = true;

double max = 0;

int init() {
      // код доступен только после оплаты
   } 

int offlineGMT(){
   int bkrH = Hour();
   int gOffset =  bkrH - GMTOffset; 
   if( gOffset < 0 ) gOffset += 24;
   else if( gOffset > 23 ) gOffset -= 24;
   return ( gOffset );
}

void commission(){ 
   if( !IsTesting() ){ 
      double rate = 0;
      for( int pos = OrdersHistoryTotal() - 1; pos >= 0; pos-- ) {
         if( OrderSelect( pos, SELECT_BY_POS, MODE_HISTORY ) ) {
            if( OrderProfit() != 0.0 ) {
               if( OrderClosePrice() != OrderOpenPrice() ) {
                  if( OrderSymbol() == Symbol() ) {
                     calculateCommission = false;
                     rate = MathAbs( OrderProfit() / MathAbs( OrderClosePrice() - OrderOpenPrice() ) );
                     commissionPoints = ( -OrderCommission() ) / rate;
                     break;
                  }
               }
            }
         }
      } 
   }
}

int start() {
      // код доступен только после оплаты
   }   
   int totalBuyStop = 0;
   int totalSellStop = 0;  
   int ticket;  
   int totalTrades = 0;
   int accountTrades = 0; 
   double accountEquity;
   if( calculateCommission ) commission();
   gmt = offlineGMT();
   prepareSpread();
   manageTicks();   

   for( int pos = 0; pos < OrdersTotal(); pos++ ) {
      r = OrderSelect( pos, SELECT_BY_POS, MODE_TRADES );
      if( OrderSymbol() != Symbol() ) continue;   
      accountTrades++;
      if( OrderMagicNumber() == MagicNumber ){ 
         totalTrades++;
         switch ( OrderType() ) {
            case OP_BUYSTOP:
               if( (int) TimeCurrent() - lastBuyOrder > VelocityTime )
                  r = OrderDelete( OrderTicket() );
               totalBuyStop++; 
            break;
            case OP_SELLSTOP:
               if( (int) TimeCurrent() - lastSellOrder > VelocityTime )
                  r = OrderDelete( OrderTicket() );
               totalSellStop++; 
            break;
            case OP_BUY:     
               accountEquity = AccountBalance() + OrderProfit() + OrderCommission() + OrderSwap(); 
               if( Bid - OrderOpenPrice() > ( Trailing * Point ) + commissionPoints + ( Profit * Point ) ){  
                  if( OrderStopLoss() == 0.0 || Bid - OrderStopLoss() > Trailing * Point )
                     if( NormalizeDouble( Bid - ( Trailing * Point ), Digits ) != OrderStopLoss() )
                        r = OrderModify( OrderTicket(), OrderOpenPrice(), NormalizeDouble( Bid - ( Trailing * Point ), Digits ), OrderTakeProfit(), 0 );                  
               } else {
                  if( accountEquity > max || accountEquity / AccountBalance() < ( ( double ) 100 - MaxDrawdown ) / 100 ){
                     if( Bid < OrderOpenPrice() - ( VelocityTrigger * Point ) )
                        if( OrderStopLoss() == 0.0 || Bid - OrderStopLoss() > ( Trailing * Point * Trailing ) )
                           if( NormalizeDouble( Bid - ( Trailing * Point ), Digits ) != OrderStopLoss() )
                              r = OrderModify( OrderTicket(), OrderOpenPrice(), NormalizeDouble( Bid - ( Trailing * Point ), Digits ), OrderTakeProfit(), 0 ); 
                  }
               } 
            break;
            case OP_SELL:     
 

Показано первые 50% кода (символов: 7032)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
703,20₽ ≈ $8.59