[ARCHIVIO] Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 3. - pagina 557
Capisco, finora è più facile per me scrivere in questo modo.
Puoi dirmi come sbarazzarmi del "while" che viene eseguito un'altra volta?
Non esiste una cosa "più facile" - non si scrive " dimmi come sbarazzarmi di mentre PRESTO...". E nel codice, devi tenere a mente che tutto quello che hai scritto deve essere compreso da una macchina stupida".
Quindi ci sono due modi: giusto e sbagliato.
Capisco la pigrizia di riscriverlo correttamente, la pigrizia di capire le regole, quindi dimmi da quanto tempo stai cercando di scrivere questa cosa in un file? Tre settimane...
Ciao, potresti dirmi come scrivere una condizione: se una posizione aperta(non importa quante, la numerazione non è necessaria) chiude una o più posizioni redditizie, come faccio ad aprirne una nuova dopo?
Stasjan: Salve, consigliate come scrivere una condizione: se una posizione aperta (non importa quante, la numerazione non è necessaria) chiude una o più redditizie, come aprire una nuova posizione (una) dopo?
Modifica per te stesso:
//---Поиск последнего отработавшего ордера для открытия очередной позиции --- for (orderIndex = (OrdersHistoryTotal() - 1); orderIndex >= 0; orderIndex--)
{
if (!OrderSelect(orderIndex, SELECT_BY_POS, MODE_HISTORY)) {Print("Ошибка при доступе к исторической базе (",GetLastError(),")");continue;}
if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != MagicNumber)) continue;
//------------------------- Принимаем в расчет только ордер, закрытый cамым крайним -----------------------if (time<OrderCloseTime()) //(сравниваем его с хранящимся в пероеменной time)
{
time=OrderCloseTime(); //если время закрытия ордера больше - ложим его в переменную int lastType = OrderType();
double lastLots = OrderLots();
double lastProfit = OrderProfit() + OrderSwap();
// Анализ только что закрывшегося ордера if (lastProfit >= 0.0)
{
//---Ордер закрылся с прибылью - обнуляем счетчик итераций, счетчик для подсчета последовательного убытка позиций колен лавины,//---текущий и суммарный убыток и открываемся стартовым лотом по тренду
Sum_Loss=0;
Iteration = 0;
if (Lot(StopLossPips)==false) //Функции передаем ширину накала
{
Comment("Пополните счет. Не хватает средств на минимальный лот. Советник остановлен."); // Если средств не хватает на мин, то выходPrint ("Пополните счет. Не хватает средств на минимальный лот. Lots_New = ",Lots_New, " AccountFreeMargin() = ", AccountFreeMargin() );
// Если средств не хватает на мин, то выходreturn (0);
}
// Ордер закрылся с прибылью, открываемся стартовым лотом // if (iOpen(Symbol(),signal_period,1)<iClose(Symbol(),signal_period,1))if(OsMA_1>0 && OsMA_2<0)
switch(Filter.Hour) // торги по времени Да=1/Нет=0
{
case0: WmOrderSend(Symbol(), OP_BUY, Lots_New, Ask, 0, 0, "старт после профита", MagicNumber); break;
case1: if (TimeHour(TimeCurrent()) >= Start && TimeHour(TimeCurrent()) < End)WmOrderSend(Symbol(), OP_BUY, Lots_New, Ask, 0, 0, "старт после профита", MagicNumber); break;
}
if(OsMA_1<0 && OsMA_2>0)
switch(Filter.Hour) // торги по времени Да=1/Нет=0
{
case0: WmOrderSend(Symbol(), OP_SELL, Lots_New, Bid, 0, 0, "старт после профита", MagicNumber); break;
case1: if (TimeHour(TimeCurrent()) >= Start && TimeHour(TimeCurrent()) < End)WmOrderSend(Symbol(), OP_SELL, Lots_New, Bid, 0, 0, "старт после профита", MagicNumber); break;
}
}
else
{
// Ордер закрылся с убытком - открываемся в ОБРАТНОМ направлении c увеличением объема позиции в соотв-ии с вариантом ММ, если // количество итераций не выше максимального if (Iteration <= Max_Iteration && VAR_MM == 0)
// Последующие лоты открываются по множителю в соответствие с числами ФИБО switch(Iteration) // Заголовок switch
{ // Начало тела switch case1 : Lots_New = lastLots * 1; lots = lastLots; Print("Iteration = ", Iteration, " Lots_New = ", Lots_New );break; //расчет нового объема case2 : Lots_New = lots * 2; Print("Iteration = ", Iteration, " Lots_New = ", Lots_New ); break;
case3 : Lots_New = lots * 3; Print("Iteration = ", Iteration, " Lots_New = ", Lots_New ); break;
case4 : Lots_New = lots * 5; Print("Iteration = ", Iteration, " Lots_New = ", Lots_New ); break;
case5 : Lots_New = lots * 8; Print("Iteration = ", Iteration, " Lots_New = ", Lots_New ); break;
case6 : Lots_New = lots * 13; Print("Iteration = ", Iteration, " Lots_New = ", Lots_New ); break;
case7 : Lots_New = lots * 21; Print("Iteration = ", Iteration, " Lots_New = ", Lots_New ); break;
case8 : Lots_New = lots * 34; Print("Iteration = ", Iteration, " Lots_New = ", Lots_New ); break;
case9 : Lots_New = lots * 55; Print("Iteration = ", Iteration, " Lots_New = ", Lots_New ); break;
case10: Lots_New = lots * 89; Print("Iteration = ", Iteration, " Lots_New = ", Lots_New ); break;
case11: Lots_New = lots * 144; Print("Iteration = ", Iteration, " Lots_New = ", Lots_New ); break;
case12: Lots_New = lots * 233; Print("Iteration = ", Iteration, " Lots_New = ", Lots_New ); break;
case13: Lots_New = lots * 377; Print("Iteration = ", Iteration, " Lots_New = ", Lots_New ); break;
case14: Lots_New = lots * 610; Print("Iteration = ", Iteration, " Lots_New = ", Lots_New ); break;
case15: Lots_New = lots * 987; Print("Iteration = ", Iteration, " Lots_New = ", Lots_New ); break;
case16: Lots_New = lots * 1597; Print("Iteration = ", Iteration, " Lots_New = ", Lots_New ); break;
default: Lots_New = lots * 2584; Print("Iteration = ", Iteration, " Lots_New = ", Lots_New );
} // Конец тела switch // ---------НОРМАЛИЗУЕМ НОВЫЕ РАСЧЕТНЫЕ ЛОТЫ И ОТКРЫВАЕМ ОЧЕРЕДНУЮ ПОЗИЦИЮ...
Lots_New = NormalizeLots(Lots_New);
if (lastType == OP_SELL) WmOrderSend(Symbol(), OP_BUY, Lots_New, Ask, 0, 0, "итерация" , MagicNumber);
if (lastType == OP_BUY) WmOrderSend(Symbol(), OP_SELL,Lots_New, Bid, 0, 0, "итерация" , MagicNumber);
} // к еlse - конец работы после предыдущего убыточного закрытого ордера return (0);
} // к if (time<OrderCloseTime()) - конец анализа и торгов по итогам закрытия самого свежего ордера // Найден закрытый ордер, но он старый break;
} // выход из цикла по истории ордеров
non esiste una cosa "più facile" - non si scrive "dimmi come sbarazzartene mentre lo fai... E nel codice devi tenere a mente che tutto quello che hai scritto deve essere compreso da un pezzo di hardware stupido".
Quindi ci sono due modi: giusto e sbagliato.
Capisco anche il MOLTO pigro a riscrivere correttamente, MOLTO pigro a capire le regole, quindi dimmi da quanto tempo stai tormentando il tuo topic con la scrittura di un file? Tre settimane...
Risolvo i problemi man mano che si presentano, l'Expert Advisor lo programmo dal 10 gennaio. Sono passate 4 settimane. Sto cercando di programmare in MQL dal 6 gennaio.
orb: Risolvo i problemi man mano che si presentano, l'Expert Advisor che sto programmando dal 10 gennaio. sono passate 4 settimane. Sto cercando di programmare in MQL dal 6 gennaio.
Devi scrivere correttamente il principio. i dati in ingresso, in uscita, ciò che è nel blocco principale. e poi ottimizzare il codice. con il tempo diventerà un'abitudine, esattamente l'ottimizzazione e la scrittura corretta, e posso capirti ed essere come te, che non sta ottimizzando per un principiante.
Stasjan: Roman grazie, ma non riesco a capire da dove viene la metà delle variabili perché non tutto il codice
#include <stdlib.mqh>#include <stderror.mqh>//#include <dynamic_channel.mqh> // динамический канал//#include <TrailingByFractals_LAVINA.mqh>//#include <TrailingByFractals.mqh>//// Внешние переменные (оптимизируются)externstring A0 = "Параметры ММ";
externdouble Lots = 0.1; // Стартовый лотexterndouble MaxRisk = 0; // риск на капитал в %// рассчитываем объем позиции взависимости от размера стопа, при заданном риске// например при депо 10 000 риск 1% при стопе 100 пп это будет примерно лот 0.1,// при стопе 200 пп уже лот должен быть 0.05, для того чтобы риск 1% остался на том же уровнеexternint MaxLoss = 90; // Максимально допустимая просадка в процентах от балансаexterndouble StopLoss = 0; // Стоплосс в пипсах - для пятизнака для йены, золота, серебра...int TakeProfitPips = 0; // Тейкпрофит в пипсах externint Period_ATR = 30; // значение АТР для расчета динамического каналаexterndouble Mul_TP = 4.0; // целевая прибыль в единицах волатильности (АТР)externdouble Mul_Sl = 0.8; // защитная остановка с последующим переворотом при ее сработке уже // увеличенным лотом в единицах волатильности (АТР)externint Max_Iteration = 36; // Максимальное количество итераций (ордеров) в мартине externint k = 2; // с какой итерации тралимexternint VAR_MM = 0; // используемый вариант усреднения в соотв-ии: множитель с числами ФИБО = 0 / множитель по арифметической прогрессии = 1// 2 - классический мартин - удвоение предыдущего объема с 3-его усреднения externstring Trailing = "---------- Параметры трала";
externint UseTrailing = 1; // Использовать = 1/не использовать = 0 трал externint type = 0; // вид трала - возможные значения: 0 - простой, 1 - по фракталам, 2 - по теням N свечей. externbool trlinloss = false; // Тралим только профит для всех видов траловexternstring A1 = "Параметры простого трала,пo фракталам,теням N баров,каналу,МА,SAR";
externint TralingStop = 1000; // дистанция простого трала в положительной зоне (пункты)externint indent = 100; // отступ (пунктов) при трале по фракталам, теням N свечей, ценовому каналу, МА,SARexternint bars_n = 10; // количество баров, для трала по их теням (от 1 и больше) или расчета границ канала externstring A2 = "Таймфрейм, время работы и параметры технических индикаторов";
//extern int t_trend_period =6; // 1-М1, 2-М5, 3-М15, 4-М30, 5-Н1...-для старшего фильтра, внутри которого работаемexternint s_trend_period = 3; // PERIOD_M1 1 1 минута// PERIOD_M5 5 5 минут// PERIOD_M15 15 15 минут// PERIOD_M30 30 30 минут// PERIOD_H1 60 1 час// PERIOD_H4 240 4 часа// PERIOD_D1 1440 1 день// PERIOD_W1 10080 1 неделя// PERIOD_MN1 43200 1 месяц// 0 (ноль) 0 Период текущего графика externint Filter.Hour=0; // Д-Фильтр: торговля по часам, вне этих часовых рамок новые сделки не открываем, но текущие итеpации завершаемexternint Start=9;
externint End=20;
// Параметры используемых индикаторовexternint Fast = 5;
externint Slow = 39;
externint Signal = 20;
externint MagicNumber = 7; // магик //extern int Period_MA = 20; // Период МА //extern int Period_ADX = 40; //extern int ADXOpenLevel = 12; //---- входные параметры индикатора iVAR//extern int n = 5;//extern int nBars = 100000;//extern int Iteration = 0; // счетчик для подсчета итераций, колен лавины//extern int Sum_Loss = 0;#include <TrailingByFractals_LAVINA.mqh> // ТРАЛ ПО ФРАКТАЛАМ#include <TrailingByShadows.mqh> // ТРАЛ ПО ТЕНЯМ N БАРОВ//// Глобальные переменные//staticdatetime prevtime = 0; // по ценам открытияbool IsExpertFailed = false;
bool IsExpertStopped = false;
int NumberOfTry = 25;
int SlipPips = 3;
int signal_period;
int trend_period;
bool UseSound = true;
color ColorBuy = Blue;
color ColorSell = Red;
string ok.wav;
double Level_new, PointValue,
lots; // вспомогательная переменная для расчета нового размера лота при очередной итерацииint Iteration, Counter_Loss, Ticket_at_history; // счетчик для подсчета последовательного убытка позиций колен лавины//bool Flag_Counter_Loss = false;double Current_Loss, Sum_Loss; // текущий и суммарный убытокint ticket; // Номер ордераdouble orderLots; // Lots double orderProfit; // Profitdouble Price; // Цена открытия рыночного ордераdouble SL; // Значение StopLoss ордераdouble TP; // Значение TakeProfit ордераdouble F1 = 1.0; // значение цены фрактала вверх (на 2-ом баре)double F11 = 1.0; // вспомогательная переменнаяdouble F2 = -200.0; // значение цены фрактала вниз (на 2-ом баре)double F22 =-200.0; // вспомогательная переменная double V_StopLossPips=0;
double V_TakeProfitPips=0;
//double StopLossPips;int Ticker, Counter;
double channel;
double StopLossPips;
double Lots_New; // Количество лотов для новых ордеровint time = 0; // время - для определения факта работы только с последним закрытым ордером
Ciao, domanda sulla durata dell'ordine, ho bisogno che un ordine "viva" per 2 minuti
Perché una tale costruzione dà l'errore 3 - perché e come correggerlo?
Capisco, finora è più facile per me scrivere in questo modo.
Puoi dirmi come sbarazzarmi del "while" che viene eseguito un'altra volta?
Non esiste una cosa "più facile" - non si scrive " dimmi come sbarazzarmi di mentre PRESTO...". E nel codice, devi tenere a mente che tutto quello che hai scritto deve essere compreso da una macchina stupida".
Quindi ci sono due modi: giusto e sbagliato.
Capisco la pigrizia di riscriverlo correttamente, la pigrizia di capire le regole, quindi dimmi da quanto tempo stai cercando di scrivere questa cosa in un file? Tre settimane...
Salve, consigliate come scrivere una condizione: se una posizione aperta (non importa quante, la numerazione non è necessaria) chiude una o più redditizie, come aprire una nuova posizione (una) dopo?
Modifica per te stesso:
non esiste una cosa "più facile" - non si scrive "dimmi come sbarazzartene mentre lo fai... E nel codice devi tenere a mente che tutto quello che hai scritto deve essere compreso da un pezzo di hardware stupido".
Quindi ci sono due modi: giusto e sbagliato.
Capisco anche il MOLTO pigro a riscrivere correttamente, MOLTO pigro a capire le regole, quindi dimmi da quanto tempo stai tormentando il tuo topic con la scrittura di un file? Tre settimane...
Risolvo i problemi man mano che si presentano, l'Expert Advisor che sto programmando dal 10 gennaio. sono passate 4 settimane. Sto cercando di programmare in MQL dal 6 gennaio.
Roman grazie, ma non riesco a capire da dove viene la metà delle variabili perché non tutto il codice
Come faccio a determinare il prezzo massimo o minimo tra due periodi di tempo? C'è una funzione speciale per questo?