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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.