내 질문에 도움이 될 정보가 충분하지 않다고 생각합니다.)) 내 질문을 추가하겠습니다. 다음은 내 Expert Advisor의 주요 기능이 포함된 구조를 제공합니다. 내가 강조한 문제가 무엇인지 알아낼 수도 있습니다.
// ПОДКЛЮЧАЕМЫЕ БИБЛИОТЕКИ С ФУНКЦИЯМИ// ВНЕШНИЕ ПАРАМЕТРЫ// ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ
Init()
{
// ПРОВЕРКА: ПРАВИЛЬНО ЛИ ВВЕДЕНЫ ЗНАЧЕНИЯ ТАЙМФРЕЙМОВ ВО ВНЕШНИХ ПАРАМЕТРАХ.
}
Deinit()
{
return ( 0 );
}
Start()
{
// ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ// ИНДИКАТОРЫ// УСЛОВИЯ// ФУНКЦИИ ВИЗУАЛИЗАЦИИ// ФУНКЦИЯ УДАЛЕНИЯ ОРДЕРОВ ПРИ ИСПОЛНЕНИИ ОПРЕДЕЛЁННОГО УСЛОВИЯ//--- ВЫЗОВ ФУНКЦИИ УПРАВЛЕНИЯ КАПИТАЛОМ ------------------------------------------------------------------// if (Money_Management_OnOff == TRUE)
{
MM_FxProp(Delta,Start_Lot,Start_Deposit,Step_Lot,Stop_Trade, Symbol ());
Lots = NormalizeDouble ( GlobalVariableGet ( "fxprop_lot" ), 2 );
//--- ПРОВЕРКА: ИЗМЕНИЛОСЬ ЛИ ЗНАЧЕНИЕ ЛОТА С ЦЕЛЬЮ ПЕРЕУСТАНОВКИ ОТЛОЖЕННЫХ ОРДЕРОВ ----------------//
Re_Set_All_Orders_by_Lots(dgt, Lots);
}
else Lots = 0.1 ;
// ФУНКЦИЯ ИНФОРМАЦИОННОЙ ПАНЕЛИ// ПРОВЕРКА НА НОВЫЙ БАР// ПРОВЕРКА НА КОЛ-ВО БАРОВ НА ГРАФИКЕ// ПРОВЕРКА НА КОЛ-ВО ЗНАКОВ В СИМВОЛЕ// УСТАНОВКА ФЛАГОВ, ЕСЛИ ИСПОЛНЯЮТСЯ УСЛОВИЯ ДЛЯ ЗАКРЫТИЯ ОПРЕДЕЛЁННЫХ ПОЗИЦИЙ// ФУНКЦИИ ЗАКРЫТИЯ ПОЗИЦИЙ ПО ОПРЕДЕЛЁННЫМ УСЛОВИЯМ// ФУНКЦИЯ ТРЕЙЛИНГ СТОПА// ФУНКЦИЯ МОДИФИКАЦИИ ОТЛОЖЕННЫХ ОРДЕРОВ// ФУНКЦИЯ УСТАНОВКИ ОТЛОЖЕННЫХ ОРДЕРОВ// ФУНКЦИЯ ОТКРЫТИЯ ПОЗИЦИИ ПО ОПРЕДЕЛЁННЫМ УСЛОВИЯМ// УДАЛЕНИЕ ОТЛОЖЕННЫХ ОРДЕРОВ ПО ОПРЕДЕЛЁННЫМ УСЛОВИЯМ//--- ЗАНОСИТЬ ДАННЫЕ В ОТЧЁТ ТОЛЬКО, ЕСЛИ КОЛ-ВО ЗАКРЫТЫХ ПОЗИЦИЙ ИЗМЕНИЛОСЬ
Amount_Positions = 0 ;
for (count = 0 ; count < OrdersHistoryTotal (); count++)
{
OrderSelect (count, SELECT_BY_POS, MODE_HISTORY);
if ( OrderType () == OP_BUY || OrderType () == OP_SELL)
{
Amount_Positions++;
}
}
if (Amount_Close_Deals != Amount_Positions)
{
if (Short_Trade_Report == TRUE)
{
// ФУНКЦИЯ ФОРМИРУЮЩАЯ ОТЧЁТ
}
Amount_Close_Deals = Amount_Positions;
}
}
현재 Expert Advisor의 매개변수에서 자금 관리 기능을 활성화/비활성화한 후 매번 Expert Advisor를 다시 컴파일해야 보고서가 올바르게 생성됩니다.
이것이 충분하다고 생각한다면 분명히 - 그렇습니다. 답변을 기다리는 일만 남았습니다. 제가 그건 없어요
불행히도 지금까지의 경험으로는 제공된 정보가 특정 문제를 해결하기에 충분한지 여부를 판단할 수 없습니다. 고의로 하지 않았고, 있다면 사과드립니다.)) 사실 제가 다룬 문제에서 핵심은 Expert Advisor를 다시 컴파일할 때 모든 것이 올바르게 작동한다는 것이 제 생각입니다. 그러나 다시 말하지만 이것은 나의 미숙한 경험 때문입니다. 이 문제를 해결하기 위해 어떤 정보를 제공해야 하는지 알려주십시오. 문제는 분명히 자금 관리 기능 또는 보고서 생성 기능과 관련이 있습니다. 따라서 저는 자금 관리 기능을 제공할 것입니다.
double MM_FxProp( double Delta, double Start_Lot, double Start_Deposit, double Step_Lot, double Stop_Trade, string fSymbol)
{
if (Delta < Step_Lot || Start_Lot < Step_Lot || // если Delta <, чем 0.01 или Start_Lot <, чем 0.01 или
Start_Deposit <= MarketInfo (fSymbol, MODE_MARGINREQUIRED) / 10.0 || // Start_Depo <=, чем размер свободных средств, ...// ...необходимых для открытия 1 лота на покупку (разделить на 10) илиAccountFreeMarginCheck (fSymbol, OP_BUY, Start_Lot) <= Stop_Trade || // размер свободных средств после BUY <= Stop_Trade илиAccountFreeMarginCheck (fSymbol, OP_SELL, Start_Lot) <= Stop_Trade || // размер свободных средств после SELL <= Stop_Trade или
Start_Lot < MarketInfo (fSymbol, MODE_MINLOT) || // Start_Lot <, чем минимальный возможный или
(fSymbol != "GBPUSD" && fSymbol != "EURUSD" && fSymbol != "USDCHF" && fSymbol != "USDJPY" && // нет ни одного инструмента из ниже перечисленных, то
fSymbol != "AUDUSD" && fSymbol != "USDCAD" && fSymbol != "EURCHF" && fSymbol != "EURGBP" &&
fSymbol != "EURJPY" && fSymbol != "EURCAD" && fSymbol != "EURAUD" && fSymbol != "GBPCHF" &&
fSymbol != "GBPJPY" && fSymbol != "CHFJPY" && fSymbol != "NZDUSD" && fSymbol != "USDSEK" &&
fSymbol != "USDDKK" && fSymbol != "USDNOK" && fSymbol != "USDSGD" && fSymbol != "USDZAR" &&
fSymbol != "EURNZD" && fSymbol != "AUDJPY" && fSymbol != "AUDNZD" && fSymbol != "AUDCAD" &&
fSymbol != "AUDCHF" && fSymbol != "CADCHF" && fSymbol != "CADJPY" && fSymbol != "NZDJPY" && fSymbol != "XAUUSD" ))
{
Print ( "Расчет лота функцией MM_FxProp() невозможен из-за некорректности значений переданных ей аргументов." );
return ( 0 );
}
double S_D = Start_Deposit;
double S_L = Start_Lot;
double Stp_L = Step_Lot;
double stepUP = 0 ;
double stepDW = 0 ;
if ( AccountBalance () >= Start_Deposit) //если текущий баланс >= значению Start_Depo, то
{
while ( AccountBalance () > S_D + Delta * ( 10.0 * S_L)) //пока текущий баланс >, чем результат формулы
{
S_D += Delta * ( 10.0 * S_L);
S_L += Stp_L;
}
stepUP = S_D + Delta * ( 10.0 * S_L);
stepDW = S_D;
}
if ( AccountBalance () < Start_Deposit)
{
while ( AccountBalance () < S_D)
{
if (S_L > Stp_L) S_L -= Stp_L;
else S_L = Stp_L;
S_D -= Delta * ( 10.0 * S_L);
}
stepDW = S_D;
stepUP = S_D + Delta * ( 10.0 * S_L);
}
if ( AccountFreeMarginCheck (fSymbol, OP_BUY, S_L) <= Stop_Trade || // если размер свободных средств после BUY <= Stop_Trade илиAccountFreeMarginCheck (fSymbol, OP_SELL, S_L) <= Stop_Trade || // размер свободных средств после SELL <= Stop_Trade илиGetLastError () == 134/* NOT_ENOUGH_MONEY */ || // не хватает средств для операции или
S_L < MarketInfo (fSymbol, MODE_MINLOT)) // расчитанный объём лота <, чем минимальный возможный, то
{
while ( AccountFreeMarginCheck (fSymbol, OP_BUY, S_L) <= Stop_Trade || // пока размер свободных средств после BUY <= Stop_Trade илиAccountFreeMarginCheck (fSymbol, OP_SELL, S_L) <= Stop_Trade) // размер свободных средств после SELL <= Stop_Trade, то
{
S_L -= Stp_L; // считаем так.if (S_L < MarketInfo (fSymbol, MODE_MINLOT)) // если же расчитанный объём лота <, чем минимальный возможный, то
{
Print ( "Объём средств на счете не позволяет открыть позицию минимального объёма." );
return ( GlobalVariableSet ( "fxprop_lot" , 0 ));
}
}
}
else {
GlobalVariableSet ( "fxprop_lot" , S_L);
Comment ( "Средств на счете: " , DoubleToStr ( AccountBalance (), 2 ), ", лот: " , S_L, ", лот + " , Stp_L, "при >=" , stepUP, ", лот - " , Stp_L, "при <" , stepDW); return ;
}
return ( 0.0 );
}
어떻게 확인할까요?
고맙습니다.
그러나 일반적으로 어드바이저를 다시 시작하지 않고 MaxEquity 설정이 예를 들어 500번 작동하도록 할 수 있습니까?
예를 들어 카운터에 숫자 500을 쓰면 다음과 같이 나옵니다. 초기 자본이 10,000이라고 가정해 보겠습니다.
그런 다음 초기 자본 10,000(설정에 표시됨)으로 증분한 후 큰 마이너스가 닫힙니다.
그래서 500배(예를 들어)(결국 초기 자본을 500배 곱하는 것은 여전히 불가능합니다).
즉, 옵션에 따라 차이가 나타납니다. 초기 자본 = 10,000에 대해 10,000 증가 후 -
어드바이저를 다시 시작할 필요는 없지만 주기는 계속됩니다. 다른 10,000이 20,000에 추가되고 30,000 + 10,000이 되는 식으로 500번 추가됩니다(예:). 잘
그리고 각 증분 = 10,000 후에 가장 큰 마이너스를 가진 손실 주문이 마감됩니까(또는 여러 주문 - 설정에 표시됨)?
고맙습니다.
그러나 일반적으로 어드바이저를 다시 시작하지 않고 MaxEquity 설정이 예를 들어 500번 작동하도록 할 수 있습니까?
예를 들어 카운터에 숫자 500을 쓰면 다음과 같이 나옵니다. 초기 자본이 10,000이라고 가정해 보겠습니다.
그런 다음 초기 자본 10,000(설정에 표시됨)으로 증분한 후 큰 마이너스가 닫힙니다.
그래서 500배(예를 들어)(결국 초기 자본을 500배 곱하는 것은 여전히 불가능합니다).
즉, 옵션에 따라 차이가 나타납니다. 초기 자본 = 10,000에 대해 10,000 증가 후 -
어드바이저를 다시 시작할 필요가 없으며 주기가 계속됩니다. 다른 10,000이 20,000에, 30,000 + 10,000에 500번 추가되는 식으로 계속됩니다(예:). 잘
그리고 각 증분 = 10,000 후에 가장 큰 마이너스를 가진 손실 주문이 마감됩니까(또는 여러 주문 - 설정에 표시됨)?
다시 시작할 필요가 없습니다. 포지션을 청산한 후 초기 자본에 대한 데이터를 업데이트하고 새로운 초기 자본에서 자본 증가를 기다려야 합니다.
그러나 내가 이해하는 바와 같이 그것은 모두 프로그램 코드에서 수행됩니다. 프로그래밍 능력이 없다)
당연히. 자산을 지속적으로 모니터링하고 지정된 값을 초과하는 경우 수익성이 없는 포지션을 청산하라는 명령을 보내는 하나의 기능만 필요합니다. 또한 이러한 모든 포지션을 성공적으로 마감한 후에는 새로운 자본 상태를 기억하고 계속 추적하십시오.
무엇이 문제일 수 있는지 말씀해 주십시오.
내 질문에 도움이 될 정보가 충분하지 않다고 생각합니다.)) 내 질문을 추가하겠습니다. 다음은 내 Expert Advisor의 주요 기능이 포함된 구조를 제공합니다. 내가 강조한 문제가 무엇인지 알아낼 수도 있습니다.
현재 Expert Advisor의 매개변수에서 자금 관리 기능을 활성화/비활성화한 후 매번 Expert Advisor를 다시 컴파일해야 보고서가 올바르게 생성됩니다.
추신 아마도 이것은 터미널 fxprop_lot 의 전역 변수 때문일까요?
내 질문에 도움이 될 정보가 충분하지 않다고 생각합니다.)) 내 질문을 추가하겠습니다. 다음은 내 Expert Advisor의 주요 기능이 포함된 구조를 제공합니다. 아마도 내가 강조한 문제가 무엇인지 밝혀질 것입니다.
현재 Expert Advisor의 매개변수에서 자금 관리 기능을 활성화/비활성화한 후 매번 Expert Advisor를 다시 컴파일해야 보고서가 올바르게 생성됩니다.
추신 아마도 이것은 전역 터미널 변수 fxprop_lot 때문 입니까?
이것이 충분하다고 생각한다면 분명히 - 그렇습니다. 답변을 기다리는 일만 남았습니다. 제가 그건 없어요
이것이 충분하다고 생각한다면 분명히 - 그렇습니다. 답변을 기다리는 일만 남았습니다. 제가 그건 없어요
그리고 다음 포스팅에서는 리포트 생성 기능을 ...불행히도 지금까지의 경험으로는 제공된 정보가 특정 문제를 해결하기에 충분한지 여부를 판단할 수 없습니다. 고의로 하지 않았고, 있다면 사과드립니다.)) 사실 제가 다룬 문제에서 핵심은 Expert Advisor를 다시 컴파일할 때 모든 것이 올바르게 작동한다는 것이 제 생각입니다. 그러나 다시 말하지만 이것은 나의 미숙한 경험 때문입니다. 이 문제를 해결하기 위해 어떤 정보를 제공해야 하는지 알려주십시오. 문제는 분명히 자금 관리 기능 또는 보고서 생성 기능과 관련이 있습니다. 따라서 저는 자금 관리 기능을 제공할 것입니다.
void Short_Trade_Report( int Mgc_Src_LP_TS№ 1 , int Mgc_LP01_TS№ 1 , int Mgc_LP02_TS№ 1 , int Mgc_LP03_TS№ 1 , int Mgc_LP04_TS№ 1 , int Mgc_LP05_TS№ 1 , int Mgc_LP06_TS№ 1 , int Mgc_Src_SP_TS№ 1 , int Mgc_SP01_TS№ 1 , int Mgc_SP02_TS№ 1 , int Mgc_SP03_TS№ 1 , int Mgc_SP04_TS№ 1 , int Mgc_SP05_TS№ 1 , int Mgc_SP06_TS№ 1 , int Mgc_Src_LP_TS№ 2 , int Mgc_LP01_TS№ 2 , int Mgc_LP02_TS№ 2 , int Mgc_LP03_TS№ 2 , int Mgc_LP04_TS№ 2 , int Mgc_LP05_TS№ 2 , int Mgc_LP06_TS№ 2 , int Mgc_Src_SP_TS№ 2 , int Mgc_SP01_TS№ 2 , int Mgc_SP02_TS№ 2 , int Mgc_SP03_TS№ 2 , int Mgc_SP04_TS№ 2 , int Mgc_SP05_TS№ 2 , int Mgc_SP06_TS№ 2 , int Mgc_Src_LP_TS№ 3 , int Mgc_LP01_TS№ 3 , int Mgc_LP02_TS№ 3 , int Mgc_LP03_TS№ 3 , int Mgc_LP04_TS№ 3 , int Mgc_LP05_TS№ 3 , int Mgc_LP06_TS№ 3 , int Mgc_Src_SP_TS№ 3 , int Mgc_SP01_TS№ 3 , int Mgc_SP02_TS№ 3 , int Mgc_SP03_TS№ 3 , int Mgc_SP04_TS№ 3 , int Mgc_SP05_TS№ 3 , int Mgc_SP06_TS№ 3 ) { #define RA 10000 // Range Array - Размер массива для отчёта double Acc_Bal_Close[RA]; // Массив для баланса на закрытии сделки(-ок) double Acc_Bal_Open[RA]; // Массив для баланса на открытии сделки(-ок) double Price_Open_Pos[RA]; double Price_Stop_Loss[RA]; double TS№ 1 _DS[RA], TS№ 2 _TA[RA], TS№ 3 _SBH[RA]; int pos, handle, dgt, Magic, sign, index; double Swap_P; double Profit_P; double Commission; double Open_Price; double Stop_Loss; string Type_Pos; string comment; string Str_Stop_Loss; //--- ПРОВЕРКА НА КОЛ-ВО ЗНАКОВ В СИМВОЛЕ ДЛЯ РАСЧЁТА ОТСТУПА В СТРОКАХ КОММЕНТАРИЕВ --------------------------------// int digit_string; int digit = MarketInfo ( Symbol (),MODE_DIGITS); switch (digit) { case 2 : digit_string = 4 ; dgt = 100 ; break ; case 3 : digit_string = 5 ; dgt = 100 ; break ; case 4 : digit_string = 6 ; dgt = 10000 ; break ; case 5 : digit_string = 7 ; dgt = 10000 ; break ; default : Print ( "Неизвестный символ! Количество знаков = " ,digit); return ( 0 ); } handle = FileOpen ( "ShortReport.csv" , FILE_CSV | FILE_WRITE ); if (handle > 0 ) //1 { FileWrite (handle, "Time Close" + "," + "Symbol" + "," + "Type" + "," + "Lots" + "," + "Balance($)" + "," + "Stop Loss(p)" + "," + "Profit(p)" + "," + "TS#1_DS(p)" + "," + "TS#2_TA(p)" + "," + "TS#3_SBH(p)" ); for (pos = 0 ; pos < OrdersHistoryTotal (); pos++) // 2 { OrderSelect (pos,SELECT_BY_POS,MODE_HISTORY); Commission = OrderCommission (); Swap_P = ( OrderSwap ()/ 10 )/ OrderLots (); Profit_P = ( OrderProfit ()/ 10 )/ OrderLots ()+( OrderSwap ()/ 10 )/ OrderLots (); Open_Price = NormalizeDouble ( OrderOpenPrice (), Digits ); index = StringFind ( OrderComment (), "[sl]" , 0 ); if (index != - 1 ) { comment = StringSubstr ( OrderComment (), 0 , StringLen ( OrderComment ())- 4 ); } else { comment = StringSubstr ( OrderComment (), 0 , StringLen ( OrderComment ())); } if ( OrderType () < 2 && OrderCloseTime () == TimeCurrent () && ( OrderMagicNumber () == Mgc_Src_LP_TS№ 1 || OrderMagicNumber () == Mgc_Src_SP_TS№ 1 || OrderMagicNumber () == Mgc_LP01_TS№ 1 || OrderMagicNumber () == Mgc_LP02_TS№ 1 || OrderMagicNumber () == Mgc_LP03_TS№ 1 || OrderMagicNumber () == Mgc_LP04_TS№ 1 || OrderMagicNumber () == Mgc_LP05_TS№ 1 || OrderMagicNumber () == Mgc_LP06_TS№ 1 || OrderMagicNumber () == Mgc_SP01_TS№ 1 || OrderMagicNumber () == Mgc_SP02_TS№ 1 || OrderMagicNumber () == Mgc_SP03_TS№ 1 || OrderMagicNumber () == Mgc_SP04_TS№ 1 || OrderMagicNumber () == Mgc_SP05_TS№ 1 || OrderMagicNumber () == Mgc_SP06_TS№ 1 )) { TS№ 1 _DS[pos] = Profit_P + Swap_P + Commission; Acc_Bal_Close[pos] = AccountBalance (); Str_Stop_Loss = StringSubstr (comment, StringLen (comment)-digit_string,digit_string); Price_Stop_Loss[pos] = MathAbs (( StrToDouble (Str_Stop_Loss)-Open_Price)*dgt); } if ( OrderType () < 2 && OrderCloseTime () == TimeCurrent () && ( OrderMagicNumber () == Mgc_Src_LP_TS№ 2 || OrderMagicNumber () == Mgc_Src_SP_TS№ 2 || OrderMagicNumber () == Mgc_LP01_TS№ 2 || OrderMagicNumber () == Mgc_LP02_TS№ 2 || OrderMagicNumber () == Mgc_LP03_TS№ 2 || OrderMagicNumber () == Mgc_LP04_TS№ 2 || OrderMagicNumber () == Mgc_LP05_TS№ 2 || OrderMagicNumber () == Mgc_LP06_TS№ 2 || OrderMagicNumber () == Mgc_SP01_TS№ 2 || OrderMagicNumber () == Mgc_SP02_TS№ 2 || OrderMagicNumber () == Mgc_SP03_TS№ 2 || OrderMagicNumber () == Mgc_SP04_TS№ 2 || OrderMagicNumber () == Mgc_SP05_TS№ 2 || OrderMagicNumber () == Mgc_SP06_TS№ 2 )) { TS№ 2 _TA[pos] = Profit_P + Swap_P + Commission; Acc_Bal_Close[pos] = AccountBalance (); Str_Stop_Loss = StringSubstr (comment, StringLen (comment)-digit_string,digit_string); Price_Stop_Loss[pos] = MathAbs (( StrToDouble (Str_Stop_Loss)-Open_Price)*dgt); } if ( OrderType () < 2 && OrderCloseTime () == TimeCurrent () && ( OrderMagicNumber () == Mgc_Src_LP_TS№ 3 || OrderMagicNumber () == Mgc_Src_SP_TS№ 3 || OrderMagicNumber () == Mgc_LP01_TS№ 3 || OrderMagicNumber () == Mgc_LP02_TS№ 3 || OrderMagicNumber () == Mgc_LP03_TS№ 3 || OrderMagicNumber () == Mgc_LP04_TS№ 3 || OrderMagicNumber () == Mgc_LP05_TS№ 3 || OrderMagicNumber () == Mgc_LP06_TS№ 3 || OrderMagicNumber () == Mgc_SP01_TS№ 3 || OrderMagicNumber () == Mgc_SP02_TS№ 3 || OrderMagicNumber () == Mgc_SP03_TS№ 3 || OrderMagicNumber () == Mgc_SP04_TS№ 3 || OrderMagicNumber () == Mgc_SP05_TS№ 3 || OrderMagicNumber () == Mgc_SP06_TS№ 3 )) { TS№ 3 _SBH[pos] = Profit_P + Swap_P + Commission; Acc_Bal_Close[pos] = AccountBalance (); Str_Stop_Loss = StringSubstr (comment, StringLen (comment)-digit_string,digit_string); Price_Stop_Loss[pos] = MathAbs (( StrToDouble (Str_Stop_Loss)-Open_Price)*dgt); } if ( OrderType () == OP_BUY) { Type_Pos = "buy" ; } if ( OrderType () == OP_SELL) { Type_Pos = "sell" ; } if ( OrderType () < 2 ) { FileWrite (handle, TimeToStr ( OrderCloseTime (),TIME_DATE|TIME_MINUTES)+ "," + Symbol ()+ "," +Type_Pos+ "," + DoubleToStr ( OrderLots (), 2 )+ "," + DoubleToStr (Acc_Bal_Close[pos], 2 )+ "," + DoubleToStr (Price_Stop_Loss[pos], 2 )+ "," + DoubleToStr (Profit_P+Swap_P+Commission, 2 )+ "," + DoubleToStr (TS№ 1 _DS[pos], 2 )+ "," + DoubleToStr (TS№ 2 _TA[pos], 2 )+ "," + DoubleToStr (TS№ 3 _SBH[pos], 2 )); } } FileClose (handle); // 2\ } //1 }
문제를 해결하도록 도와주세요.초기화 시 자금 관리 기능을 호출 하려고 했습니다.
하지만 문제가 해결되지는 않습니다...