#c#
#c#
Вопрос:
Я не уверен, что использую правильный выбор слов. У меня есть эта переменная fibo2, а внутри есть другая переменная nearclose . nearclose исходит из результата процесса формул. В конце скрипта nearclose возвращает число, скажем, 10. Он возвращает 10, потому что fibo2 начинается с вычисления в начале с переменной Close .getValueAt(CurrentBar):
fibo2 = (Close.GetValueAt(CurrentBar) - lowPrice0) / (Ncma - lowPrice0);
Как только первое вычисление будет выполнено, я хочу заменить Close .Получаем значение (CurrentBar) по результату nearclose, 10. Я могу сделать это вручную следующим образом, заменив Close .Получить значение (CurrentBar) на 10:
fibo2 = (10 - lowPrice0) / (Ncma - lowPrice0);
и nearclose в конце возвращает новое значение 11. Чтобы в следующий раз 11 заменить 10, чтобы получить новое значение, которое снова заменит 11. Таким образом, я могу создать список всех значений после обработки каждого столбца.
Поэтому я решил заменить Close .Получить значение (CurrentBar) с помощью nearclose:
fibo2 = (nearclose - lowPrice0) / (Ncma - lowPrice0);
Проблема в том, что он создает какой-то внутренний цикл и возвращает 0 или неправильное значение.
Отредактированная часть:
Теперь это небольшой пример основной идеи:
double fibo2 = 0;
double nearclose = 8;
double lowPrice0 = 4;
double Ncma = 5;
double x = 10;
fibo2 = (nearclose - lowPrice0) / (Ncma - lowPrice0);
nearclose = fibo2 * x;
var numbers = new List<double> {};
numbers.Add(nearclose);
foreach (var item in numbers)
{
Print(item);
}
Печать возвращает 40, но если вы замените nearclose на 40, он вернет 360.Чем в списке, который вы заканчиваете с {8, 40, 360 …}
Вы отправляете обратно новое значение, созданное nearclose, самому nearclose в fibo2.
В моем коде (не в этом примере) nearclose = 0; потому что результат получен из формул, сгенерированных циклом for столбцов на диаграмме. Я надеюсь, что это поможет больше.
Отредактированная часть 2020-10-27
public void WhateverTheChartingNameIs()
{
var barCount = 3;
var results = new List<double> { nearclose };
for(int i = 0; i < barCount; i )
{
var result = RunCalculation(results[i]);
results.Add(result);
Print("Result" result);
}
}
private double RunCalculation(double nearclose)
{
return (nearclose - lowPrice0) / (Ncma - lowPrice0);
}
Комментарии:
1. честно говоря, довольно сложно понять вопрос; ничто из показанного не касается «возврата» чего-либо, и показанный код недоступен для выполнения, поэтому мы не можем видеть то, что вы видите (и не было бы ясно, что вы ожидаете увидеть). Многие вещи, показанные в коде, который там есть, на самом деле не объявлены , и мы не можем видеть, являются ли они локальными, полями и т. Д.; Мы также не можем увидеть, пытаетесь ли вы распределить значения между несколькими методами. Возможно многое, но здесь не так много, чтобы понять, что вы пытаетесь сделать, предложить рекомендации. Не могли бы вы, возможно, сделать его работоспособным?
2. FWIW, я ожидаю, что «добавить
ref
к нарушающему параметру» — это вероятное исправление здесь, но очень сложно сказать без контекста3. Как долго это должно выполняться? В вашем примере вы исправили это в цикле while в 3 раза, но откуда взялись эти 3?
4. «Это код в 700 строк». — хитрость, когда задаешь подобные вопросы, заключается не в том, чтобы публиковать больше , а в том, чтобы публиковать меньше ; каков минимальный код, который показывает ту же проблему , но, возможно, с гораздо меньшей конкретикой? Я был бы поражен, если бы та же проблема не могла быть показана в 10-20 строках полностью выполняемого кода, например: (совершенно не связанный код): gist.github.com/mgravell/c4f9590f72f9be4687bb188df2e01d2d (по сути: все, что мы можем возможно удалить, потому что это не нужно, чтобы показать реальную проблему: обычно не имеет отношения к вопросу , и кактаким образом, мы должны его удалить)
5. Я читаю о ссылке в docs.micro, чтобы узнать об этом. Я попытаюсь создать образец. Я не уверен, что такое параметр-нарушитель. Спасибо
Ответ №1:
Похоже, вы просто хотите выполнить вычисление, записать результат, а затем использовать этот результат в качестве переменной в следующем вычислении для заданного количества выполнений. Если да, я думаю, вы можете сделать это:
public IList<double> CalculateResults(double startNumber, int barCount)
{
var results = new List<double> { startNumber };
for(int i = 0; i < barCount; i )
{
var result = RunCalculation(results[i]);
results.Add(result);
}
return results;
}
private double RunCalculation(double nearClose)
{
var lowPrice0 = //whatever this is;
var Ncma = //whatever this is;
return (nearClose - lowPrice0) / (Ncma - lowPrice0);
}
Обновить
Если под вашим комментарием вы подразумеваете, что программное обеспечение для построения графиков просто печатает результаты, то вместо того, чтобы возвращать список результатов, сделайте его недействительным и распечатайте результаты следующим образом:
public void WhateverTheChartingNameIs()
{
var nearClose = 8;
var barCount = 3;
var results = new List<double> { nearClose };
for(int i = 0; i < barCount; i )
{
var result = RunCalculation(results[i]); //same as above. If you can't do this just stick the logic from this method inside the for loop.
results.Add(result);
Print(result);
}
}
Комментарии:
1. Вы понимаете основы. Я должен создать образец, иначе это бессмысленно. На самом деле нужна только эта часть: fibo2 = (nearclose — lowPrice0) / (Ncma — lowPrice0);
2. я использую программное обеспечение для построения графиков, у которого есть свой собственный класс. Это не позволяет использовать общедоступные и частные. Чем я могу заменить public IList<double> CalculateResults(double startNumber, int BarCount) и private double?
3. @Frankdot Итак, что делает класс программного обеспечения для построения графиков? Возвращает ли он результаты или просто печатает их?
4. Во-первых, вы видели мою отредактированную часть, вчера я внес некоторые уточнения. Во-вторых, спасибо за помощь. Программное обеспечение для построения графиков Ninjatrader.com . Он имеет 2 класса OnBarUpdate и OnRender. ninjatrader.com/support/helpGuides/nt8/?onbarupdate.htm и ninjatrader.com/support/helpGuides/nt8/?onrender.htm , я кодирую OnRender. Вот почему я спрашиваю, есть ли способ изменить общедоступную часть IList<double> CalculateResults(double startNumber, int BarCount)? Я не англоговорящий программист-любитель, поэтому я часто использую неправильные термины, чтобы выразить себя.
5. хорошо, в небольшом тесте с новым индикатором он работает, удаляя public void независимо от того, что такое имя диаграммы () , теперь мне нужно изменить возвращаемую часть, чтобы избавиться от вычисления выполнения класса и включить эту часть в OnRender. Спасибо