aschq.mq4
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «aschq.mq4» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
ASC++ — торговый советник для платформы MetaTrader 4, реализующий автоматическую торговлю на основе комбинации индикатора Williams %R, усреднённого диапазона ценовых колебаний и анализа истинного диапазона движения. Советник формирует сигналы на покупку и продажу, выставляет стоп-ордера на вход и управляет открытыми позициями через торговый API MetaTrader 4.
Логика работы основана на отслеживании тренда через динамические уровни поддержки и сопротивления, расчёте волатильности за заданный период и подтверждении сигналов индикатором PercentR. Советник проверяет текущие рыночные условия при каждом тике и при выполнении всех условий размещает стоп-ордера на вход либо модифицирует существующие ордера и позиции.
Советник работает только с текущим символом и поддерживает одновременное управление несколькими ордерами одного типа. Все торговые операции выполняются через стандартные функции OrderSend, OrderModify и OrderClose с контролем проскальзывания.
Настройки программы
| Настройка | Описание |
|---|---|
| Lots | Объём лота — Объём торговой позиции в лотах, передаваемый в OrderSend при открытии стоп-ордера. |
| TakeProfit | Тейк-профит — Расстояние в пунктах от цены входа для установки уровня фиксации прибыли в стоп-ордере. |
| StopLoss | Стоп-лосс — Расстояние в пунктах от цены входа для установки уровня стоп-лосса в стоп-ордере. |
| TrailingStop | Трейлинг-стоп — Параметр, объявленный как входной, но в текущей версии кода не используется напрямую в логике управления позицией. |
| Risk | Уровень риска — Влияет на чувствительность сигналов и пороговые уровни входа: изменяет базовые значения x1, x2 и value10. |
| EntryStopLevel | Уровень стоп-ордера — Расстояние в пунктах от текущей цены, на которое смещается цена размещения стоп-ордера на вход. |
| EntryRange | Диапазон входа — Максимальный усреднённый диапазон колебаний в пунктах, при котором допускается вход в позицию. |
| TSLevel1 | Уровень трейлинга 1 — Первый порог прибыли в пунктах от цены входа, при достижении которого активируется первая модификация стоп-лосса. |
| TSLevel2 | Уровень трейлинга 2 — Второй порог прибыли в пунктах от цены входа, при достижении которого стоп-лосс перемещается на более дальний уровень. |
| SigValMin | Минимальное значение сигнала — Минимальная сила сигнала, необходимая для подтверждения условия входа в позицию. |
| Sllipage (Slippage) | Проскальзывание — Максимально допустимое проскальзывание в пунктах при размещении и закрытии ордеров. |
Поиск по коду файла
extern double Lots = 0.10;
extern int TakeProfit = 100;
extern int StopLoss = 40;
extern int TrailingStop = 20;
extern int Risk=3;
extern int EntryStopLevel=10;
extern int EntryRange=27;
extern int TSLevel1=30;
extern int TSLevel2=60;
extern int SigValMin=5;
extern int Slippage=3; // Sllipage
double value2=0, value3=0, x1=70, x2=30;
double TrueCount=0,Range=0, AvgRange=0, MRO1=0, MRO2=0;
double val1=0, val2=0,t0=0,TradesOnSymbol=0;
double AvgRange3=0,price2=0,value30=0,dK2=0;
double V1=0,V2=0,P1=9,n1=9,n2=49,V3=0,V4=0,P2=54,wprfast=0,wprslow=0,cnt=0;
double value=0,price=0,dK=0, AvgRange2=0,WATR=0,AveragePeriod=10,Reg=1;
double ESLevel=0,vartime=0,SigValBuy=0,SigValSell=0,SigValBuy1=0,SigValSell1=0,timecntsell=0,timecntbuy=0,sl=0;
double nrtrr[10],nrtrg[10],nrtrwatrr[10],nrtrwatrg[10],ascsigbuy[30],ascsigsell[30],Table_value2[50];
int i=0,StartBars=1,bar=0,trend=0,trend2=0,shift=0,Counter=0,i1=0,cnt1=0,value10=10,value11=0;
int init()
{
// код доступен только после оплаты
}
int deinit()
{
return(0);
}
int start()
{
// код доступен только после оплаты
}
value10=3+Risk*2;
x1=67+Risk;
x2=33-Risk;
value11=value10;
wprfast=0;
wprslow=0;
V1=iWPR(NULL,0,P1,cnt)*iWPR(NULL,0,P1,0)/100;
V2=MathCeil(V1);
if (V2<n1) wprfast=V2;
if (V2>n2) wprfast=-(V2);
V3=iWPR(NULL,0,P2,cnt)*iWPR(NULL,0,P2,0)/100;
V4=MathCeil(V3);
if (V4<n1) wprslow=V4;
if (V4>n2) wprslow=-(V4);
AvgRange2=0;
for (i=AveragePeriod;i>=1; i--) {
dK = 1+(AveragePeriod-i)/AveragePeriod;
AvgRange2=AvgRange2+ dK*MathAbs(High[i]-Low[i]);
}
WATR = AvgRange2/AveragePeriod;
if (Close[StartBars-1] > Open[StartBars-1]) {
value = Close[StartBars - 1] * (1 - WATR);
trend = 1;
nrtrwatrg[0]= value;
nrtrwatrr[0]= 0;
}
if (Close[StartBars-1] < Open[StartBars-1]) {
value = Close[StartBars - 1] * (1 + WATR);
trend = -1;
nrtrwatrr[0]= value;
nrtrwatrg[0]= 0;
}
for (bar=50;bar>=0; bar--) {
if (trend >= 0) {
if (Close[bar] > price) price = Close[bar];
value = price * (1 - WATR);
if (Close[bar] < value) {
price = Close[bar];
value = price * (1 + WATR);
trend = -1;
}
}
else
if (trend <= 0) {
if (Close[bar] < price) price = Close[bar];
value = price * (1 + WATR);
if (Close[bar] > value) {
price = Close[bar];
value = price * (1 - WATR);
trend = 1;
}
}
if (trend == -1) {
nrtrwatrr[bar]= value;
nrtrwatrg[bar]= 0;
}
if (trend == 1) {
nrtrwatrg[bar]= value;
nrtrwatrr[bar]= 0;
}
}
AvgRange3=0;
for (i=1; i<=AveragePeriod; i++) {
AvgRange3=AvgRange3 + MathAbs(High[i]-Low[i]);
}
dK2 = AvgRange3/AveragePeriod;
if (Close[0] > Open[0]) {
value30 = Close[0] * (1 - dK2);
trend2 = 1;
nrtrg[0]= value30;
nrtrr[0]=0;
}
if (Close[0] < Open[0]) {
value30 = Close[0] * (1 + dK2);
trend2 = -1;
nrtrr[0]=value30;
nrtrg[0]=0;
}
for (bar = 50; bar>=0; bar--) {
if (trend2 >= 0){
if (Close[bar] > price2) price2 = Close[bar];
value30 = price2 * (1 - dK2);
if (Close[bar] < value30) {
price2 = Close[bar];
value30 = price2 * (1 + dK2);
trend2 = -1;
}
}
else
if (trend2 <= 0) {
if (Close[bar] < price2) price2 = Close[bar];
value30 = price2 * (1 + dK2);
if (Close[bar] > value30) {
price2 = Close[bar];
value30 = price2 * (1 - dK2);
trend2 = 1;
}
}
if (trend2 == -1) {
nrtrr[bar]= value30;
nrtrg[bar]= 0;
}
if (trend2 == 1) {
nrtrg[bar]= value30;
nrtrr[bar]= 0;
}
}
for (shift=30; shift>=0; shift--) {
Counter=shift;
Range=0.0;
AvgRange=0.0;
for (Counter=shift; Counter<=shift+9; Counter++) AvgRange=AvgRange+MathAbs(High[Counter]-Low[Counter]);
Range=AvgRange/10;
Counter=shift;
TrueCount=0;
while (Counter<shift+9 && TrueCount<1)
{if (MathAbs(Open[Counter]-Close[Counter+1])>=Range*2.0) TrueCount=TrueCount+1;
Counter=Counter+1;
}
if (TrueCount>=1) {MRO1=Counter;} else {MRO1=-1;}
Counter=shift;
TrueCount=0;
while (Counter<shift+6 && TrueCount<1)
{if (MathAbs(Close[Counter+3]-Close[Counter])>=Range*4.6) TrueCount=TrueCount+1;
Counter=Counter+1;
}
if (TrueCount>=1) {MRO2=Counter;} else {MRO2=-1;}
if (MRO1>-1) {value11=3;} else {value11=value10;}
if (MRO2>-1) {value11=4;} else {value11=value10;}
value2=100-MathAbs(iWPR(NULL,0,value11,shift)); // PercentR(value11=9)
Table_value2[shift]=value2;
value3=0;
if (value2<x2)
{i1=1;
while (Table_value2[shift+i1]>=x2 && Table_value2[shift+i1]<=x1){i1++;}
if (Table_value2[shift+i1]>x1)
{
value3=High[shift]+Range*0.5;
val1=value3;
val2=0;
}
}
if (value2>x1)
{i1=1;
while (Table_value2[shift+i1]>=x2 && Table_value2[shift+i1]<=x1){i1++;}
if (Table_value2[shift+i1]<x2)
{
value3=Low[shift]-Range*0.5;
val2=value3;
val1=0;
}
}
ascsigsell[shift]=val1;
ascsigbuy[shift]=val2;
}
if (ascsigsell[1]>0 && ascsigsell[0]>0)
{
SigValSell=Period();
timecntbuy=0;
SigValBuy=Показано первые 50% кода (символов: 7859)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.